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 相关文章推荐
pyside写ui界面入门示例
Jan 22 Python
python根据出生日期返回年龄的方法
Mar 26 Python
深入Python函数编程的一些特性
Apr 13 Python
Python+Opencv识别两张相似图片
Mar 23 Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
python 内置函数汇总详解
Sep 16 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
Oct 11 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
Feb 28 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
基于logstash实现日志文件同步elasticsearch
Aug 06 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生成缩略图的函数代码(修改版)
2011/01/18 PHP
destoon调用discuz论坛中带图片帖子的实现方法
2014/08/21 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
php检查页面是否被百度收录
2015/10/28 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
vue服务端渲染缓存应用详解
2018/09/12 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
在layui.use 中自定义 function 的正确方法
2019/09/16 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python通过文件头判断文件类型
2015/10/30 Python
简单实现python画圆功能
2018/01/25 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
在python 中实现运行多条shell命令
2019/01/07 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
平面设计岗位职责
2013/12/14 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android