mtop
本次毕设题目是《基于Python爬虫的购物比价系统的设计与实现》。既然是爬虫,就涉及到数据的获取,在实现本系统的过程中,主要爬取了淘宝、京东和当当三大电商平台的商品数据。本文就以淘宝为例,详细说明获取商品数据的过程。
在此之前,首先以本系统中商品历史价格数据的获取为铺垫,较为简单的说明数据的获取的过程。本系统中对于商品的历史价格使用echarts图表进行了较为直观的展示,历史价格数据来源于慢慢买 - 历史价格查询。因此,首先主要说明如何在慢慢买 - 历史价格查询页面中获取到商品的历史价格数据。
- 打开网页地址输入商品链接并使用Chrome浏览器开发者工具进行抓包,如下图,其中可快速定位到历史价格请求的URL和历史价格数据(如图红色方框所示)
- 分析历史价格请求参数,如下图,其中最主要的参数为
token
,初步设想为js生成
- 全局搜索
token
,如下图,发现token
存在于页面源代码中
- Ctrl + u查看页面源代码,如下图,
token = d.encrypt('http://item.jd.com/100002308919.html', 2, true)
- 页面内无法搜索到
encrypt
方法,设想为script标签引入的js文件中的某段代码,全局搜索encrypt
,如下图,相关的链接为shenqing.js
在该js文件中搜索
encrypt
,如下图,该段js代码经过压缩、混淆和加密经过反混淆后的代码如下图,可清楚看到对应的加密方式
得到上述js代码后可使用Python执行js代码来获取对应的token值,而此次毕设中由于要先发起请求来获取历史价格数据,于是采用在前端直接执行encrypt方法获取到token参数及其他参数后传到后端进行处理并获取数据。
获取其他参数,第2步中除了
token
参数,还有DA
、action
、url
、w
参数以及bjid
、spbh
、cxid
、zkid
空白参数,其中DA
和action
都为固定值,url
为商品URL链接编码后的值,w
参数根据第4步中的页面源代码得知为iframe的宽度。事实上,在慢慢买 - 历史价格查询手机端中请求的参数只有DA
、action
、url
和token
,没有PC端的其他空白参数。
根据以上数据获取步骤,接着展开对淘宝商品数据获取的说明。由于淘宝反爬技术较为强大,目前即使采用selenium模拟浏览器进行数据的抓取也会对此进行部分限制。由于毕设数据量需求相对较大,因此考虑使用淘宝的接口进行数据的获取以提高爬取效率。但接口请求参数中又存在sign
参数,因此必须弄清其生成的方式。具体步骤如下
- 打开任一商品链接并使用Chrome浏览器开发者工具进行抓包,如下图,其中可快速定位到商品详细数据接口信息
- 分析详细信息请求参数,如下图,其中最主要的参数为
sign
,初步设想为js生成
- 相关代码如下
1 | h.prototype.__processRequestUrl = function(t) { |
其中sign = p(o.token + "&" + a + "&" + s + "&" + n.data)
,a
为时间戳,s为固定值12574478
、n.data
为提交数据,即{"itemNumId":"578012528892"}
,o.token未知
- 在该段代码的前面发现疑似处理
token
的代码,如下图,大致意思是首先如果有token则返回,否则先调用__getTokenFromAlipay()
获取token,然后再调用__getTokenFromCookie()
获取token,接着判断返回结果是否是数组以及是否是对应的值(TOKEN_EMPTY
、ILLEGAL_ACCESS
、TOKEN_EXOIRED
),进而判断下一步返回token过期还是进入下一步处理。
- 添加断点,进行调试,如下图,首先返回
FAIL_SYS_SESSION_EXPIRED
- 接着调试,如下图,会返回请求参数,经过一系列处理后,最终发送请求,调用成功
- 接着又经过一系列处理,最终调用接口获取商品详细信息。如下图
- 在开发者工具界面的Network选项卡中也可大致知晓请求顺序。如下图
- 在
__getTokenFromCookie()
处添加断点,最终在cookie中的_m_h5_tk
中找到对应的值,如下图
- token即为
_m_h5_tk
中下划线前面的值,而在第七步中发送post请求后会在cookie中生成_m_h5_tk
值,根据第4步sign = p(o.token + "&" + a + "&" + s + "&" + n.data)
,将获取到的四个参数用&
连接然后经过p()
方法加密最终生成sign
值。而根据最终sign
的格式,推测为md5加密,为验证,将js文件中对应定义的p函数拷贝到控制台,并测试,最终验证成功。如下图
- 编写代码
最终运行结果如下
1 | { |
经过测试,该API有访问频率的限制。
以上就是获取淘宝单个商品数据的全部内容,至于如何大数量获取淘宝的商品id,由于淘宝做了登录限制,在PC端几乎都要登录,而在H5页面,也只能获取到少量商品id。因爱淘宝H5页面的搜索功能未做搜索登录限制,所以本次毕设采用此页面的搜索功能,将搜索关键字作为商品的分类名称,用于获取大量商品id。