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 相关文章推荐
asyncio 的 coroutine对象 与 Future对象使用指南
Sep 11 Python
Python2.7读取PDF文件的方法示例
Jul 13 Python
python求最大连续子数组的和
Jul 07 Python
django模板加载静态文件的方法步骤
Mar 01 Python
Python如何调用外部系统命令
Aug 07 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
python 命名规范知识点汇总
Feb 14 Python
使用Python解析Chrome浏览器书签的示例
Nov 13 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
pytorch 带batch的tensor类型图像显示操作
May 20 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 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重新实现PHP脚本引擎内置函数
2007/03/06 PHP
php调用shell的方法
2014/11/05 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
php抽象方法和抽象类实例分析
2016/12/07 PHP
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
Python版中国省市经纬度
2020/02/11 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
Python如何输出整数
2020/06/07 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
这段代码难道不该打印出56吗
2013/02/27 面试题
技术总监的工作职责
2013/11/13 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
2014预备党员党课学习心得范文
2014/07/08 职场文书
学校端午节活动方案
2014/08/23 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
安阳殷墟导游词
2015/02/10 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
shell进度条追踪指令执行时间的场景分析
2022/06/16 Servers
Go语言编译原理之源码调试
2022/08/05 Golang