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中的列表知识点汇总
Apr 14 Python
Python中的FTP通信模块ftplib的用法整理
Jul 08 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
Python检测网络延迟的代码
May 15 Python
python logging重复记录日志问题的解决方法
Jul 12 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
opencv与numpy的图像基本操作
Mar 08 Python
python调用摄像头拍摄数据集
Jun 01 Python
python 求1-100之间的奇数或者偶数之和的实例
Jun 11 Python
PyQt5显示GIF图片的方法
Jun 17 Python
Pytorch Tensor基本数学运算详解
Dec 30 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
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
python生成任意频率正弦波方式
2020/02/25 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
Python 绘制可视化折线图
2020/07/22 Python
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
Street One瑞士:德国现代时装公司
2019/10/09 全球购物
技术总监个人的自我评价范文
2013/12/18 职场文书
三个儿子教学反思
2014/02/03 职场文书
环境保护标语
2014/06/20 职场文书
硕士生找工作求职信
2014/07/05 职场文书
职工食堂管理制度
2015/08/06 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python
nginx共享内存的机制详解
2022/03/21 Servers