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根据经纬度计算距离示例
Feb 16 Python
Python发送email的3种方法
Apr 28 Python
Python爬豆瓣电影实例
Feb 23 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
python实现汉诺塔算法
Mar 01 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
Python实现使用request模块下载图片demo示例
May 24 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
Jul 18 Python
Python pip 安装与使用(安装、更新、删除)
Oct 06 Python
基于selenium及python实现下拉选项定位select
Jul 22 Python
关于python3.9安装wordcloud出错的问题及解决办法
Nov 02 Python
python中validators库的使用方法详解
Sep 23 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实现把数组按指定的个数分隔
2014/02/17 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
Laravel Reponse响应客户端示例详解
2020/09/03 PHP
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
python实现telnet客户端的方法
2015/04/15 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
Python随机函数random()使用方法小结
2018/04/29 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
Python中logger日志模块详解
2020/08/04 Python
学生会副主席竞聘书
2014/03/31 职场文书
研究生导师推荐信
2014/09/06 职场文书
学生上课说话检讨书
2014/10/25 职场文书
百年校庆感言
2015/08/01 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书
2019经典广告词集锦!
2019/07/02 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python