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 相关文章推荐
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
Python实现字符串的逆序 C++字符串逆序算法
May 28 Python
Python实现的建造者模式示例
Aug 06 Python
python实现最大子序和(分治+动态规划)
Jul 05 Python
python之pexpect实现自动交互的例子
Jul 25 Python
TensorFlow实现保存训练模型为pd文件并恢复
Feb 06 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
基于Tensorflow的MNIST手写数字识别分类
Jun 17 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
python字典进行运算原理及实例分享
Aug 02 Python
Python可视化学习之seaborn调色盘
Feb 24 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在线解压ZIP文件的方法
2014/12/30 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
2015/12/24 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
document.getElementBy(&quot;id&quot;)与$(&quot;#id&quot;)有什么区别
2013/09/22 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
实例解析Array和String方法
2016/12/14 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
小程序实现多选框功能
2018/10/30 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
在Django框架中编写Context处理器的方法
2015/07/20 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
python os.path模块常用方法实例详解
2018/09/16 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
Python hashlib模块实例使用详解
2019/12/24 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
python判断变量是否为列表的方法
2020/09/17 Python
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
匡威英国官网:Converse英国
2018/12/02 全球购物
2014年大班元旦活动方案
2014/02/26 职场文书
环保建议书500字
2014/05/14 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
2014年民警工作总结
2014/11/25 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
离婚起诉书范本
2015/05/18 职场文书
学雷锋感言
2015/08/03 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang