python爬取淘宝商品详情页数据


Posted in Python onFebruary 23, 2018

在讲爬取淘宝详情页数据之前,先来介绍一款 Chrome 插件:Toggle JavaScript (它可以选择让网页是否显示 js 动态加载的内容),如下图所示:

python爬取淘宝商品详情页数据

当这个插件处于关闭状态时,待爬取的页面显示的数据如下:

python爬取淘宝商品详情页数据

当这个插件处于打开状态时,待爬取的页面显示的数据如下:

python爬取淘宝商品详情页数据

  可以看到,页面上很多数据都不显示了,比如商品价格变成了划线价格,而且累计评论也变成了0,说明这些数据都是动态加载的,以下演示真实价格的找法(评论内容找法类似),首先检查页面元素,然后点击Network选项卡,刷新页面,可以看到很多动态加载的数据,在里面找到包含商品价格的链接(可以使用Ctrl+f查找),如下图所示:

python爬取淘宝商品详情页数据

  将此链接在新的标签页打开,如下图所示,可以看到,被禁止访问了,所以爬取的时候要在headers中加上Referer字段告诉服务器你是从哪个页面链接过来的,Referer字段可以在这里查看:

python爬取淘宝商品详情页数据 

评论数据的链接可以直接访问(和价格信息找法类似),这里我知己去访问它,如下图所示:

python爬取淘宝商品详情页数据

  可以看到评论信息总共有7页,而且都是json格式的数据,所以可以用json反序列化去抽取数据,当然也可以用正则表达式,下面我将演示用正则去抽取数据,因为评论数据过多,这里只抓取第一页,如果需要所有评论数据,可以循环构造url,只需要修改currentPage参数的值就行。程序源码如下:

# filename:spider_taobao.py
#!/usr/bin/env python
# -*- coding=utf-8 -*-

import re
import urllib2

def spider_taobao(url):

 headers = {
  'Accept':'application/json, text/plain, */*',
  'Accept-Language':'zh-CN,zh;q=0.3',
  'Referer':'https://item.taobao.com/item.htm',
  'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
  'Connection':'keep-alive',
 }

 goods_id = re.findall('id=(\d+)', url)[0]

 try:
  req = urllib2.Request(url=url, headers=headers)
  res = urllib2.urlopen(req).read().decode('gbk', 'ignore')
 except Exception as e:
  print '无法打开网页:', e.reason

 try:
  title = re.findall('<h3 class="tb-main-title" data-title="(.*?)"', res)
  title = title[0] if title else None
  line_price = re.findall('<em class="tb-rmb-num">(.*?)</em>', res)[0]

  # 30-42行为抓取淘宝商品真实价格,该数据是动态加载的
  purl = "https://detailskip.taobao.com/service/getData/1/p1/item/detail/sib.htm?itemId={}&modules=price,xmpPromotion".format(goods_id)

  price_req = urllib2.Request(url=purl, headers=headers)
  price_res = urllib2.urlopen(price_req).read()
  data = list(set(re.findall('"price":"(.*?)"', price_res)))
  # data列表中的价格可能是定值与区间的组合,也可能只是定值,而且不一定有序
  real_price = ""
  for t in data:
   if '-' in t:
    real_price = t
    break
  if not real_price:
   real_price = sorted(map(float, data))[0]

  # 45-53行为抓取评论数据,该数据也是动态加载的
  comment_url = "https://rate.tmall.com/list_detail_rate.htm?itemId={}&sellerId=880734502¤tPage=1".format(goods_id)
  comment_data = urllib2.urlopen(comment_url).read().decode("GBK", "ignore")
  temp_data = re.findall('("commentTime":.*?),"days"', comment_data)
  temp_data = temp_data if temp_data else re.findall('("rateContent":.*?),"reply"', comment_data)
  comment = ""
  for data in temp_data:
   comment += data.encode('utf-8')
  comment = comment if comment else "暂无评论"
 except Exception as e:
  print '数据抽取失败!!!'

 print '商品名:', title
 print '划线价格:', line_price
 print '真实价格:', real_price
 print '商品链接:', url
 print '部分评论内容:', comment

if __name__ == '__main__':
 #url = 'https://item.taobao.com/item.htm?spm=a230r.1.14.30.43306a3fOeuZ0B&id=553787375606&ns=1&abbucket=10#detail'
 url = raw_input("请输入商品链接: ")
 spider_taobao(url)

运行结果如下:

python爬取淘宝商品详情页数据

更多内容请参考专题《python爬取功能汇总》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在GitHub Pages上使用Pelican搭建博客的教程
Apr 25 Python
json跨域调用python的方法详解
Jan 11 Python
Java分治归并排序算法实例详解
Dec 12 Python
Numpy数组转置的两种实现方法
Apr 17 Python
python与caffe改变通道顺序的方法
Aug 04 Python
python解析json串与正则匹配对比方法
Dec 20 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
Jun 19 Python
python替换字符串中的子串图文步骤
Jun 19 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
python/golang 删除链表中的元素
Sep 14 Python
快速创建python 虚拟环境
Nov 28 Python
Python实现随机爬山算法
Jan 29 Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 #Python
python列表生成式与列表生成器的使用
Feb 23 #Python
1分钟快速生成用于网页内容提取的xslt
Feb 23 #Python
python使用xslt提取网页数据的方法
Feb 23 #Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
Feb 23 #Python
python爬虫获取多页天涯帖子
Feb 23 #Python
Python即时网络爬虫项目启动说明详解
Feb 23 #Python
You might like
php unset全局变量运用问题的深入解析
2013/06/17 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
2019/04/10 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
泛谈JS逻辑判断选择器 || &amp;&amp;
2019/05/24 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
详解Python如何获取列表(List)的中位数
2016/08/12 Python
Python读取指定目录下指定后缀文件并保存为docx
2017/04/23 Python
python删除文本中行数标签的方法
2018/05/31 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
物业保安主管岗位职责
2013/12/25 职场文书
总经理司机岗位职责
2014/02/06 职场文书
主持词开场白
2014/03/17 职场文书
毕业生就业意向书
2014/04/01 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
2014年中职班主任工作总结
2014/12/16 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书