1. 逆向分析慢慢买比价网的加密机制
第一次尝试爬取慢慢买比价网的商品历史价格数据时,我发现直接发送HTTP请求会返回403错误。经过抓包分析,发现网站对关键接口做了双重加密防护:Authorization头部和动态token参数。这让我想起去年做京东价格监控时遇到的类似情况,不过慢慢买的加密逻辑要复杂得多。
通过Chrome开发者工具的Network面板,可以看到获取历史价格的请求是这样的:
POST /api.ashx HTTP/1.1
Host: tool.manmanbuy.com
Authorization: BasicAuth D8DD2812A942776AF9ED750C2D6D7539BF204F7C0B0FB414E6CEBD28536A99D07304FA7BFFBB2BDD6B9B46823A9D19FA751316693F17DD79FF26D70E2EBA1BF31918AB09FC305FCFB80352187AE32269B8D8DB1977F84F1E
Content-Type: application/x-www-form-urlencoded
method=getHistoryTrend&key=https://item.jd.com/6290488.html&t=1610601399358&token=DAF418E3848F4B4BB1C8CA6F23AD331D
关键点在于:
- Authorization不是常规的Base64编码
- token参数每次请求都会变化
- 请求必须携带有效的Cookie
2. 破解Authorization生成逻辑
首先来看Authorization头部的生成方式。通过调试JS代码,发现它是通过以下步骤生成的:
- 从页面中获取ticket值(隐藏在HTML的隐藏字段中)
- 对ticket进行位移处理:将最后4位移动到开头
- 拼接"BasicAuth "前缀
用Python实现这个逻辑:
import re
import requests
def get_authorization():
session = requests.Session()
# 先获取包含ticket的页面
resp = session.get('http://tool.manmanbuy.com/HistoryLowest.aspx')
if resp.status_code != 200:
raise Exception('获取ticket失败')
# 使用正则提取ticket值
match = re.search(r'id="ticket".+?value="(.+?)"', resp.text)
if not match:
raise Exception('未找到ticket字段')
ticket = match.group(1)
# 将最后4位移到开头
processed = ticket[-4:] + ticket[:-4]
return f'BasicAuth {processed}'
实测发现这个Authorization的有效期大约30分钟,超过后需要重新获取。在实际爬虫中,我们需要缓存这个值并在失效时自动更新。
3. 解密动态token生成算法
token的生成算法更为复杂,通过逆向分析JS代码,我整理出它的生成步骤:
- 准备基础参数:method、key(商品URL)、t(13位时间戳)

&spm=1001.2101.3001.5002&articleId=155209249&d=1&t=3&u=f2779421bc2a491786a74f74a4a49bef)
5518

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



