开年后,一直在弄爬虫相关方面的工作,今天就以淘宝问大家为例,将爬虫的整套过程记录下来。总结经验,查漏补缺
如何找到问大家的网页链接
-
打开手机淘宝,随意浏览个宝贝
-
进入宝贝详情页,进入问大家主页
-
点击分享,复制链接
-
在pc打开页面 得到如下链接
https://h5.m.taobao.com/wendajia/question2017.html?refId=589773891059&pre_item_id=589773891059&ttid=227200%40taobao_android_8.4.0&sourceType=other&suid=c6b1cff4-e094-4993-b346-95f826b4c9fa&ut_sk=1.We7H9xzG%2BAYDACUebBfQq6dp_21646297_1555054673708.Copy.windvane&un=d75c7f4f3565358ee7c4cca5375f99dd&share_crt_v=1&sp_tk=77+lc0l6dWJBeWVjT0Tvv6U=&cpp=1&shareurl=true&spm=a313p.22.u6.1025058449048&short_name=h.eZDBSMw&sm=4ee92f&app=chrome
请求分析
通过谷歌浏览器开发者工具的帮助,发现数据在以下请求中
https://h5api.m.taobao.com/h5/mtop.taobao.social.feed.aggregate/1.0/?jsv=2.4.1&appKey=12574478&t=1555055055046&sign=9e6bd7ca6ecd6e303f13ad53d2fd3412&api=mtop.taobao.social.feed.aggregate&v=1.0&ecode=0&timeout=300000&timer=300000&AntiCreep=true&type=jsonp&dataType=jsonp&callback=mtopjsonp1&data=%7B%22cursor%22%3A%221%22%2C%22pageNum%22%3A%221%22%2C%22pageId%22%3A24501%2C%22env%22%3A1%2C%22bizVersion%22%3A0%2C%22params%22%3A%22%7B%5C%22refId%5C%22%3A%5C%22589773891059%5C%22%2C%5C%22namespace%5C%22%3A1%2C%5C%22pageNum%5C%22%3A1%2C%5C%22pageSize%5C%22%3A10%7D%22%7D
是个get请求,参数都放在url中
重复请求一些宝贝的问大家内容,发现参数有以下规则
- 固定参数
sv: 2.4.1
appKey: 12574478
api: mtop.taobao.social.feed.aggregate
v: 1.0
ecode: 0
timeout: 300000
timer: 300000
AntiCreep: true
type: jsonp
dataType: jsonp
callback: mtopjsonp1
data: {"cursor":"1","pageNum":"1","pageId":24501,"env":1,"bizVersion":0,"params":"{\"refId\":\"宝贝ID\",\"namespace\":1,\"pageNum\":1,\"pageSize\":10}"}
- 动态参数
t: 1555055055046
sign: 9e6bd7ca6ecd6e303f13ad53d2fd3412
其中t是时间戳
sign是动态的校验参数,所以难点是如何找到sign的生成规则
sign生成规则
一般说来请求的参数都是js生成,按照这个思路,通过在js资源文件中全局搜索sign及打断点的方式。果不其然,找到了相应的js代码,到目前为止,一切还是挺顺利的
从截图中可以发现
sign是由h()函数生成的,h函数的参数是以下几部分组成
d.token + "&" + i + "&" + g + "&" + c.data
# i 是上面固定参数中的 t,当前的时间戳
# g是上面固定参数中的 appKey
# c.data 是上面固定参数中的data
所以下一步要知道d.token是如何生成的
token的生成规则
还是使用在js资源文件中全局搜索token的方式,发现了相关的js代码
n.prototype.__getTokenFromCookie = function() {
var a = this.options;
return a.CDR && j(y) ? a.token = j(y).split(";")[0] : a.token = a.token || j(z),
a.token && (a.token = a.token.split("_")[0]),
o.resolve()
}
通过对这段js代码分析,发现token原来是从cookie中提取的:
_m_h5_tk=1632671ce1a89f17ac8d06525e4b5226_1555062955474
可以通过正则提出
token = re.findall(r'_m_h5_tk\=(.+?)_',cookie)[0]
至此,全部的参数都已经知道生成规则了,接下来可以编写python代码请求数据了。
这些就简单了,改天有空再贴代码上来吧,看各位需要:)
这里只提一点,可以将生成sign的h()函数的代码单独放在一个js文件中。
在python中可以通过
import execjs
在python中调用js代码,即简单又方便。