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使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
python实现在sqlite动态创建表的方法
May 08 Python
理解python正则表达式
Jan 15 Python
python使用pyqt写带界面工具的示例代码
Oct 23 Python
python tensorflow基于cnn实现手写数字识别
Jan 01 Python
python redis连接 有序集合去重的代码
Aug 04 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
Windows系统下pycharm中的pip换源
Feb 23 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
Mar 30 Python
python zip,lambda,map函数代码实例
Apr 04 Python
python re的findall和finditer的区别详解
Nov 15 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
Zend Guard一些常见问题解答
2008/09/11 PHP
php设计模式 Delegation(委托模式)
2011/06/26 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
简单实现php上传文件功能
2017/09/21 PHP
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
2018/10/23 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
21行Python代码实现拼写检查器
2016/01/25 Python
Python用threading实现多线程详解
2017/02/03 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
python一键去抖音视频水印工具
2018/09/14 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
python的debug实用工具 pdb详解
2019/07/12 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
用python批量移动文件
2021/01/14 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
J2EE相关知识面试题
2013/08/26 面试题
怎样写好自我评价呢?
2014/02/16 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
微信搭讪开场白
2015/05/28 职场文书
收入证明申请书
2015/06/12 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers