全网最详细 tb商品价格信息爬取 sign、_m_h5_tk逆向

一、前言

        本文实现了爬取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中:

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解答。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值