一、前言
本文实现了爬取tb任意商品的价格等数据,通过修改代码中关键字、页数等请求参数即可实现爬取任意商品的价格数据

二、实现流程
1.找到搜索请求,模拟请求拿到搜索结果数据。
1)来到tb首页,在输入框中输入想搜索的商品。

2)点击搜索按钮会跳转到搜索结果页面,此时按下F12打开开发者控制台,然后按下ctrl+r强制刷新下网页(或者手动刷新也行),目的是要拦截目标请求。
刷新完成后在全局搜索(ctrl+shit+f)中可以搜索任一商品名称找一下商品数据在哪个接口中返回,可以看到数据通过https://h5api.m.taobao.com/h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0/
接口返回。

2.接口分析
1)复制接口的curl(bash)拿到https://spidertools.cn/#/base64img网站转成requests代码。

2)通过翻页请求和更换关键字重新搜索可以发现,每次变的参数有
- params中的data(与页数、关键字有关)、sign、t
- cookies中的_m_h5_tk、_m_h5_tk_enc、tfstk、isg
3)通过观察data参数可以发现关键字和页码的位置:


4)当我们更换data参数中页码或关键字的时候是请求不通的:

5)这个现象说明这个接口中含有data参与加密的加密参数(也就是sign参数),简单点说就是接口会校验data数据是否合法,当data参数被修改了,那么sign参数拿到后台解析发现和传过来的data对应不上自然也就拿不到数据了
6)所有参数的含义:
params中:
- data:包含页码、关键字等信息
- t:时间戳
- appkey:固定值
- sign:根据_m_h5_tk、t、appkey、data加密生成的参数
cookies中:
- _m_h5_tk和_m_h5_tk_enc:通过接口https://h5api.m.taobao.com/h5/mtop.taobao.pc.growth.sem.homeconfigvo/1.0/返回
- tfstk、isg:也是加密参数,但是不影响拿数据就不管
3.加密参数破解
1._m_h5_tk、_m_h5_tk_enc参数破解:
1)把cookie中的_m_h5_tk和_m_h5_tk_enc参数删除。

2)刷新页面然后在网络中局部搜索(ctrl+f)可以发现_m_h5_tk和_m_h5_tk_enc参数通过https://h5api.m.taobao.com/h5/mtop.tmall.kangaroo.core.service.route.aldlampservicefixedresv2/1.0/接口设置。

3)Python模拟请求:
import requests
headers = {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"cache-control": "no-cache",
"pragma": "no-cache",
"referer": "https://www.taobao.com/",
"sec-ch-ua": "\"Chromium\";v=\"142\", \"Microsoft Edge\";v=\"142\", \"Not_A Brand\";v=\"99\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "script",
"sec-fetch-mode": "no-cors",
"sec-fetch-site": "same-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0"
}
cookies = {
"havana_lgc_exp": "1796261761606",
"mtop_partitioned_detect": "1",
"xlly_s": "1",
"t": "59a12a874c2c5f75bd232a5c5e0e75c1",
"_tb_token_": "3eae6b1beab6e",
"thw": "cn",
"sca": "fd3d6cb6",
"cna": "wDo0IaCg/UUCAXuxNYvFAIG/",
"_samesite_flag_": "true",
"cookie2": "145f4b181bc97f804a58783a74170dde",
"isg": "BKioJvUhVX2lSnhiXglsr1hyeZa60QzbeQi2zWLZ1CMWvUgnCuB_amL-tVVNiMSz",
"tfstk": "gZzEavtoewQFl2v1RR3ygNTt5A3KY4WXLzMSZ7VoOvDHRe9ubSerd_IKRlkzIRk3U7CKZY2uUYZCfZNL943lhb7flWLWTe5U84v7s2hWnZopSZNL94deEsZGla-itRLHqY2oSccIG4cnE0cG_blqE4DnqdxiiADor8YlSNcqNevnt0fasAhorY2or1uiBb0oE80owSF3ZFljx1_JOAeMgPmEnWDwu5UZtqxLtA-BAPrnYxYrQUYu7XPoVzeBugM0Dvij3Rb684PiaRobYt8UU7VYqczyK6w0tJUYqW7Nn2aLtomuoTKu32yrmymwZE3ESA0ZsrfWDAaZd84EjsTqVV4jm2q1X9iS8jyuJJRyr-V_GynTztJiekGxSbzRi3krqg-pefDpwzEeE3on6fkf_1PhfP6wzqsat3K-jqhZh6GB23nn6fkf_1-J2ccx_x1IO"
}
url = "https://h5api.m.taobao.com/h5/mtop.tmall.kangaroo.core.service.route.aldlampservicefixedresv2/1.0/"
params = {
"jsv": "2.7.2",
"appKey": "12574478",
"t": "1765161839641",
"sign": "2d8c7334cec01b1d55ef88b5de1dcafe",
"api": "mtop.tmall.kangaroo.core.service.route.AldLampServiceFixedResV2",
"v": "1.0",
"timeout": "3000",
"dataType": "jsonp",
"valueType": "original",
"jsonpIncPrefix": "tbpc",
"ttid": "1@tbwang_windows_1.0.0#pc",
"type": "originaljsonp",
"callback": "mtopjsonptbpc1",
"data": "{\"params\":\"{\\\"resId\\\":\\\"33718589,33972676,33665512,41905558,33667440\\\",\\\"bizId\\\":\\\"443,443,443,443,443\\\"}\"}"
}
response = requests.get(url, headers=headers, cookies=cookies, params=params)
def extract_cookie_value(cookie_str, cookie_name):
"""从set-cookie字符串中提取指定cookie的值"""
# 按逗号分割不同的cookie
cookies = cookie_str.split(', ')
for cookie in cookies:
# 找到以目标cookie名开头的部分
if cookie.startswith(f"{cookie_name}="):
# 提取值(第一个分号之前的部分)
value_part = cookie.split(';')[0]
return value_part.split('=', 1)[1]
return None
set_cookie_str = response.headers.get('set-cookie', '')
# 提取需要的cookie值
_m_h5_tk = extract_cookie_value(set_cookie_str, '_m_h5_tk')
_m_h5_tk_enc = extract_cookie_value(set_cookie_str, '_m_h5_tk_enc')
print(f"_m_h5_tk: {_m_h5_tk}")
print(f"_m_h5_tk_enc: {_m_h5_tk_enc}")
4)打印结果:

2.sign破解:
1)通过搜索"sign:"关键字找到sign加密入口,发现sign参数 = eE(em.token + "&" + eT + "&" + eC + "&" + ep.data)。
其中eE为md5加密函数,em.token为_m_h5_tk值"_"之前的数据,eT为当前时间时间戳(t),eC为appKey,ep.data就是params中的data。

2)Python模拟加密:
import hashlib
import time
def md5_encrypt(str_add):
"""MD5加密"""
return hashlib.md5(str_add.encode('utf-8')).hexdigest()
_m_h5_tk="75b8903a5bdae26d94ba224b99c73b02_1765168190109"
t = str(int(time.time() * 1000))
appKey = "12574478"
data = "{\"appId\":\"34385\",\"params\":\"{\\\"device\\\":\\\"HMA-AL00\\\",\\\"isBeta\\\":\\\"false\\\",\\\"grayHair\\\":\\\"false\\\",\\\"from\\\":\\\"nt_history\\\",\\\"brand\\\":\\\"HUAWEI\\\",\\\"info\\\":\\\"wifi\\\",\\\"index\\\":\\\"4\\\",\\\"rainbow\\\":\\\"\\\",\\\"schemaType\\\":\\\"auction\\\",\\\"elderHome\\\":\\\"false\\\",\\\"isEnterSrpSearch\\\":\\\"true\\\",\\\"newSearch\\\":\\\"false\\\",\\\"network\\\":\\\"wifi\\\",\\\"subtype\\\":\\\"\\\",\\\"hasPreposeFilter\\\":\\\"false\\\",\\\"prepositionVersion\\\":\\\"v2\\\",\\\"client_os\\\":\\\"Android\\\",\\\"gpsEnabled\\\":\\\"false\\\",\\\"searchDoorFrom\\\":\\\"srp\\\",\\\"debug_rerankNewOpenCard\\\":\\\"false\\\",\\\"homePageVersion\\\":\\\"v7\\\",\\\"searchElderHomeOpen\\\":\\\"false\\\",\\\"search_action\\\":\\\"initiative\\\",\\\"sugg\\\":\\\"_4_1\\\",\\\"sversion\\\":\\\"13.6\\\",\\\"style\\\":\\\"list\\\",\\\"ttid\\\":\\\"600000@taobao_pc_10.7.0\\\",\\\"needTabs\\\":\\\"true\\\",\\\"areaCode\\\":\\\"CN\\\",\\\"vm\\\":\\\"nw\\\",\\\"countryNum\\\":\\\"156\\\",\\\"m\\\":\\\"pc\\\",\\\"page\\\":1,\\\"n\\\":48,\\\"q\\\":\\\"%E4%B9%B3%E5%88%B6%E5%93%81\\\",\\\"qSource\\\":\\\"url\\\",\\\"pageSource\\\":\\\"a21bo.jianhua/a.search_manual.0\\\",\\\"channelSrp\\\":\\\"\\\",\\\"tab\\\":\\\"all\\\",\\\"pageSize\\\":48,\\\"totalPage\\\":100,\\\"totalResults\\\":4800,\\\"sourceS\\\":\\\"0\\\",\\\"sort\\\":\\\"_coefp\\\",\\\"bcoffset\\\":\\\"\\\",\\\"ntoffset\\\":\\\"\\\",\\\"filterTag\\\":\\\"\\\",\\\"service\\\":\\\"\\\",\\\"prop\\\":\\\"\\\",\\\"loc\\\":\\\"\\\",\\\"start_price\\\":null,\\\"end_price\\\":null,\\\"startPrice\\\":null,\\\"endPrice\\\":null,\\\"itemIds\\\":null,\\\"p4pIds\\\":null,\\\"p4pS\\\":null,\\\"categoryp\\\":\\\"\\\",\\\"ha3Kvpairs\\\":null,\\\"myCNA\\\":\\\"wDo0IaCg/UUCAXuxNYvFAIG/\\\",\\\"screenResolution\\\":\\\"1920x1080\\\",\\\"userAgent\\\":\\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0\\\",\\\"couponUnikey\\\":\\\"\\\",\\\"subTabId\\\":\\\"\\\",\\\"np\\\":\\\"\\\",\\\"clientType\\\":\\\"h5\\\",\\\"isNewDomainAb\\\":\\\"false\\\",\\\"forceOldDomain\\\":\\\"false\\\"}\"}"
str_add = _m_h5_tk.split("_")[0] + "&" + t + "&" + appKey + "&" + data
sign = md5_encrypt(str_add)
print(sign)
3)打印结果:

三、总结
通过组合_m_h5_tk获取、data参数自定义,即可实现sign加密,传递正确的sign参数就可以拿到数据啦。
有问题可以添加博主主页QQ解答。
1117

被折叠的 条评论
为什么被折叠?



