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比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 Python
Django在win10下的安装并创建工程
Nov 20 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
详解django的serializer序列化model几种方法
Oct 16 Python
Python supervisor强大的进程管理工具的使用
Apr 24 Python
linux环境中没有网络怎么下载python
Jul 07 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
python脚本监控logstash进程并邮件告警实例
Apr 28 Python
Python使用jpype模块调用jar包过程解析
Jul 29 Python
Python 发送SMTP邮件的简单教程
Jun 24 Python
Python echarts实现数据可视化实例详解
Mar 03 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批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
php HandlerSocket的使用
2011/05/02 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
JQuery live函数
2010/12/24 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
在JavaScript中操作时间之setYear()方法的使用
2015/06/12 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
python实现Windows电脑定时关机
2018/06/20 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
HTML5标签使用方法详解
2015/11/27 HTML / CSS
普天C++笔试题
2016/03/20 面试题
《长城》教学反思
2014/02/14 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
日化店促销方案
2014/03/26 职场文书
对照四风自我剖析材料
2014/10/07 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS