难度: ☆☆☆☆☆ 0星

一、目标

这个链接是一个代理列表:
http://3bodyhome.com/proxy
爬虫笔记之零度代理(token)_爬虫
正常的来讲应该是有数据的,但是不知道为啥这里没有,可能是挂了,不过这个不是重点,打开开发者工具,看下Network里有个接口:
http://3bodyhome.com/proxy?page=2&num=15&token=f02e62aaa6e563cc606d65ca0e7cf9b5&t=1605278006
这个就是获取代理列表的,它的参数如下:
爬虫笔记之零度代理(token)_爬虫_02
本次要搞定的就是token参数。

 

二、分析

先对那个接口打个xhr断点:
爬虫笔记之零度代理(token)_爬虫_03
因为是ajax的接口吗,所以猜测单击“下一页”的按钮时是会发出翻页请求的,所以加完断点不必刷新页面,直接单击“下一页”按钮即可进入断点,然后格式化代码:
爬虫笔记之零度代理(token)_爬虫_04
在调用栈上单击前面的栈帧回溯,找参数是在哪里生成的,其实也不用每个栈帧都看,圈出来的那个栈帧很明显就是发请求的地方:
爬虫笔记之零度代理(token)_爬虫_05
定位到这个栈帧之后,直接就找到生成请求url的地方了,框起来的部分就是生成逻辑。
爬虫笔记之零度代理(token)_爬虫_06
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日。