Fork me on GitHub

爬虫笔记之零度代理(token)

难度: ☆☆☆☆☆ 0星

一、目标

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


二、分析

先对那个接口打个xhr断点:
2
因为是ajax的接口吗,所以猜测单击“下一页”的按钮时是会发出翻页请求的,所以加完断点不必刷新页面,直接单击“下一页”按钮即可进入断点,然后格式化代码:
3
在调用栈上单击前面的栈帧回溯,找参数是在哪里生成的,其实也不用每个栈帧都看,圈出来的那个栈帧很明显就是发请求的地方:
4
定位到这个栈帧之后,直接就找到生成请求url的地方了,框起来的部分就是生成逻辑。
5
page就是要看第几页,num就是一页有多少条,timestamp就是10位的时间戳,token就是md5(page + num + timestamp),接下来就是编码实现了。


三、编码实现

这个接口已经挂掉了,虽然不知道编码实现还有啥意义,但还是搞一下,毕竟仪式感很重要...


01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/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日。

posted @   CC11001100  阅读(525)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2019-11-25 flash逆向练习:以逆向的方式通关flash游戏《谈判专家》
点击右上角即可分享
微信分享提示