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中使用urllib2防止302跳转的代码例子
Jul 07 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
基于python进行桶排序与基数排序的总结
May 29 Python
Python设计模式之享元模式原理与用法实例分析
Jan 11 Python
python多个模块py文件的数据共享实例
Jan 11 Python
Python 监测文件是否更新的方法
Jun 10 Python
Python任意字符串转16, 32, 64进制的方法
Jun 12 Python
pandas DataFrame 交集并集补集的实现
Jun 24 Python
python用for循环求和的方法总结
Jul 08 Python
Python 中pandas索引切片读取数据缺失数据处理问题
Oct 09 Python
Python print不能立即打印的解决方式
Feb 19 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 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/06 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
php无序树实现方法
2015/07/28 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
php常用正则函数实例小结
2016/12/29 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
PDO::setAttribute讲解
2019/01/29 PHP
Javascript MD4
2006/12/20 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python自定义线程类简单示例
2018/03/23 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
python修改FTP服务器上的文件名
2019/09/11 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
如何唤起类中的一个方法
2013/11/29 面试题
师范生的个人求职信范文
2014/01/04 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
2014年远程教育工作总结
2014/12/09 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
师德师风事迹材料
2014/12/20 职场文书
农村婚庆主持词
2015/06/29 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
sass 常用备忘案例详解
2021/09/15 HTML / CSS