难度: ☆☆☆☆☆ 0星
一、目标这个链接是一个代理列表:
http://3bodyhome.com/proxy
正常的来讲应该是有数据的,但是不知道为啥这里没有,可能是挂了,不过这个不是重点,打开开发者工具,看下Network里有个接口:
http://3bodyhome.com/proxy?page=2&num=15&token=f02e62aaa6e563cc606d65ca0e7cf9b5&t=1605278006
这个就是获取代理列表的,它的参数如下:
本次要搞定的就是token参数。
二、分析
先对那个接口打个xhr断点:
因为是ajax的接口吗,所以猜测单击“下一页”的按钮时是会发出翻页请求的,所以加完断点不必刷新页面,直接单击“下一页”按钮即可进入断点,然后格式化代码:
在调用栈上单击前面的栈帧回溯,找参数是在哪里生成的,其实也不用每个栈帧都看,圈出来的那个栈帧很明显就是发请求的地方:
定位到这个栈帧之后,直接就找到生成请求url的地方了,框起来的部分就是生成逻辑。
page就是要看第几页,num就是一页有多少条,timestamp就是10位的时间戳,token就是md5(page + num + timestamp),接下来就是编码实现了。
三、编码实现
这个接口已经挂掉了,虽然不知道编码实现还有啥意义,但还是搞一下,毕竟仪式感很重要...
#!/usr/bin/env python3 # encoding: utf-8 """ @author: CC11001100 """ import hashlib import time import requests def crawl(page, num=15): # 需要先访问doc拿到一个cookie session = requests.session() url = "http://3bodyhome.com/proxy" r = session.get(url) print(f"拿到了cookie{r.cookies}") # 然后再访问接口才能拿到正确的响应 # 没有cookie访问接口会返回: # {"msg": "emmm...", "status": false} ts = int(time.time()) token = hashlib.md5(f"{page}{num}{ts}".encode("UTF-8")).hexdigest() url = f"http://3bodyhome.com/proxy?page={page}&num={num}&token={token}&t={ts}" print(url) return session.get(url).text if __name__ == "__main__": print(crawl(1)) # {"status": "true", "list": "OUhcUg=="}
仓库:
https://github.com/CC11001100/misc-crawler-public/tree/master/001-anti-crawler-js-re/01-001-3bodyhome.com
请注意爬虫文章具有时效性,本文写于2020-11-13日。