我之前抓过一个国外电商网站(shopee)的数据,其中列表页接口的请求头中有个加密参数需要破解,这个例子很简单,拿出来给新手们练练手,我写得很详细,希望对爬虫初学者有所帮助。
headers 中有个加密参数: if-none-match-,如下所示。经测试,如果不携带该参数去请求接口,返回来的是假数据。
if-none-match-: 55b03-4aa77c3bd8c96843e7fad61a4ff76088
1. 首先观察该参数,每次都是以 "55b03-" 开头,后面是一串会变的32位字符,然后在开发者工具 按 "Ctrl + Shift + F" 全局搜索一下 "if-none-match-",没有搜到,再试试搜:"55b03",也没搜到。搜不到参数定位不到加密位置怎么办?下面从第2步开始是常规的方法,其实常用的经典加密算法中就只有 MD5 和 HmacMD5 加密生成的是32位字符串,那么还可以碰运气地搜一下:"md5",很快就能定位到加密位置,直接跳到第6步。
2. 既然接口是 Ajax 加载的,那就下一个XHR断点,如下图所示。
3. 然后点击商品列表页的下一页,就会自动断在此处,如下图所示。可以看到参数 t 里面有个 headers,果然有 if-none-match- 参数。
那么接下来就应该查看函数调用的堆栈,往上找生成 headers 的函数,
4. 在调用栈(Call Stack)往上走两步就看到了headers生成位置,如下图所示:
5. 关键位置打上断点,并取消XHR断点,再点击下一页 停在该处,如下图所示。可以看到 参数 t 就是加密前的字符串了,也就是 url 后面的参数:t = "by=pop&limit=50&match_id=16&newest=200&order=desc&page_type=search&version=2"
6. 接下来按 F11 进入 O 函数,一眼就看到 md5,它赋值给了 u,这个 O 函数里就只有第 5656 行使用了 u,那么就在该行打上断点。
7. 然后按 F8 直接跳到该断点处,看到这一行有个等号 = ,像是在做赋值操作。鼠标框选等号前面的对象,自动显示出它的值,如下如图所示,就是我们要找的 if-none-match-,那么等号后面可能就是在生成加密字符串了。
同样把等号后面全部框选,显示出了一个字符串,这就是加密后的密文了,印证了我们的猜想,如下图所示:
8. 最后就来好好看看他具体是怎么加密的,首先选中 c.a ,显示出:"55b03",是个固定的字符串,再根据前面的信息可以判断 u() 函数就是 MD5 加密。
那么,c.a + "-" + u("" + c.a + u(t) + c.a) 就可以改写成:"55b03" + "-" + md5("55b03" + md5(t) + "55b03")
用 python 代码实现如下:
[Python] 纯文本查看 复制代码 from hashlib import md5
def encrypt(param):
text = "55b03" + md5(param.encode()).hexdigest() + "55b03"
return "55b03-" + md5(text.encode()).hexdigest()
t = "by=pop&limit=50&match_id=16&newest=200&order=desc&page_type=search&version=2"
print(encrypt(t))
最后验证 用 python 实现的加密和浏览器的结果一致,破解完成。
|