买家秀爬虫
这个项目学习了许多,例如面对js参与的网页如何进行爬取数据,还学习了js调试。
参考:https://blog.csdn.net/weixin_36842174/article/details/91359169
- 分析

查看下网页源码

一看这源码,不用看了,js动态生成,获取text爬虫肯行行不通了。检查后发现,数据由api获取。

传递参数有很多,反复提交确认后,仅需要提交四个参数

appkey为固定值,t为时间戳,sign暂时不知道怎么来的,动态生成,data的pagenum是当前页码,pageSize为一页现实的数据数量
检查后发现这个js里有关sign的生成

这里可以看到它定义h就是sign,直接调试





释放调试器

总结:sign生成代码h = g(c.token + ‘&’ + f + ‘&’ + e + ‘&’ + b.data)。c.token经验证为get返回cookie里的_m_h5_tk前半部分,都等于b0281729104cecb4aac0f44eac5370ee,f=现行时间戳,e=appkey固定,b.data=params
至于h=g函数,这里的g函数等于MD532位加密

以后再见到这种代码,就可以尝试MD532加密了
- 代码
import time
def get_time(): # 获取现行时间戳
return str(int(time.time() * 1000))
def creat_data(pagenum): #构造params数据
data = '{"params":"{\\"nodeId\\":\\"\\",\\"sellerId\\":\\"50852803\\",\\"pagination\\":{\\"direction\\":\\"1\\",\\"hasMore\\":\\"true\\",\\"pageNum\\":\\"' + str(
pagenum) + '\\",\\"pageSize\\":\\"' + str(20) + '\\"}}","cursor":"' + str(
pagenum) + '","pageNum":"' + str(
pagenum) + '","pageId":5703,"env":"1"}'
return data
import hashlib
def md5(str): # MD532位加密
md5 = hashlib.md5()
md5.update(str.encode('UTF-8'))
return md5.hexdigest()
先构造第一个html获取算法sign的数据,用于第二次get
appKey = '12574478'
url = 'https://acs.m.taobao.com/h5/mtop.taobao.social.feed.aggregate/1.0/'
data = creat_data(pagenum)
params = {
'appKey': appKey,
'data': data
}
html = requests.get(url,params = params)
_m_h5_tk = html.cookies['_m_h5_tk'] # 获取token用的 同时第二次get的cookie需要_m_h5_tk和_m_h5_tk_enc,应该同时取出
_m_h5_tk_enc = html.cookies['_m_h5_tk_enc']
token = _m_h5_tk.split('_')[0] #算出token,用于算出sign
t = get_time()
u = token + '&' + t + '&' + appKey + '&' + data #构造sign
sign = md5(u) #md5加密
data = creat_data(pagenum)
t = get_time()
headers = { # 构造第二次headers
'cookie': '_m_h5_tk=' + _m_h5_tk + '; _m_h5_tk_enc=' + _m_h5_tk_enc,
}
params = { #构造get参数,前面验证只需要提交4个参数即可
'appKey': appKey,
't': t,
'sign': sign,
'data': data
}
html = requests.get(url, headers=headers, params=params)
print(html.text)
· 测试
