Python实战--破解慢慢买比价网JS加密(商品历史价格爬虫进阶)

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

关键点在于:

  1. Authorization不是常规的Base64编码
  2. token参数每次请求都会变化
  3. 请求必须携带有效的Cookie

2. 破解Authorization生成逻辑

首先来看Authorization头部的生成方式。通过调试JS代码,发现它是通过以下步骤生成的:

  1. 从页面中获取ticket值(隐藏在HTML的隐藏字段中)
  2. 对ticket进行位移处理:将最后4位移动到开头
  3. 拼接"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代码,我整理出它的生成步骤:

  1. 准备基础参数:method、key(商品URL)、t(13位时间戳)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值