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 相关文章推荐
pymongo给mongodb创建索引的简单实现方法
May 06 Python
django通过ajax发起请求返回JSON格式数据的方法
Jun 04 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
Apr 09 Python
Python中shutil模块的学习笔记教程
Apr 04 Python
Python编程实现二分法和牛顿迭代法求平方根代码
Dec 04 Python
git进行版本控制心得详谈
Dec 10 Python
小米5s微信跳一跳小程序python源码
Jan 08 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
Django数据库操作之save与update的使用
Apr 01 Python
python中对二维列表中一维列表的调用方法
Jun 07 Python
Python QT组件库qtwidgets的使用
Nov 02 Python
python 对xml解析的示例
Feb 27 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 图片上添加透明度渐变的效果
2009/06/29 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
从零开始学YII2框架(四)扩展插件yii2-kartikgii
2014/08/20 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
PHP日期和时间函数的使用示例详解
2020/08/06 PHP
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
python代码xml转txt实例
2020/03/10 Python
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
建筑班组长岗位职责
2014/01/02 职场文书
幼儿园教育教学反思
2014/01/31 职场文书
2014年新生军训方案
2014/05/01 职场文书
本科应届生求职信
2014/08/05 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
在js中修改html body的样式
2021/11/11 Javascript
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js