首页 > Python资料 博客日记
实战分享反爬机制快速定位与破解
2024-10-16 11:30:03Python资料围观30次
此分享只用于学习用途,不作商业用途,若有冒犯,请联系处理
反爬前置信息
站点:aHR0cHM6Ly9jenFqZC5qc3p3ZncuZ292LmNuL2tkY3B1YXBvcnRhbC8jLw==
接口:/kong/InnerGateway/kdcpua/lib/project/publicity
反爬机制定位
在抓取某个站点时,我们需要找到目标接口,然后确定目标接口所使用的反爬机制,常见反爬机制有cookie
、请求头
、签名校验
等,只有找到它所使用的反爬机制我们才能对点下药。
找到对应的接口,右键复制其cUrl
,然后使用爬虫工具库将其转成python requests代码
,这样便于我们快速进入调试定位反爬机制
可以看到它只存在两个变量,就是cookie
和请求头
,接下来使用控制变量法,结果如下:
- 请求传入headers,传入cookie,请求成功
- 请求不传入headers,传入cookie,请求失败
- 请求传入headers,不传入cookie,请求成功
- 请求不传入headers,不传入cookie,请求成功
根据结果确定它的反爬机制只有请求头
大家看下,红色横线对应的那些请求头不会是检测点,而像Accept
,Accept-Language
,Referer
,User-Agent
都是可以写死的,大家可能会说User-Agent
也是反爬机制,User-Agent
确实可以反爬,不过它的反爬机制对应的是采集频率,我们现在是请求请求前的反爬
剔除这些后,剩下的Authorization
,Token
,x-date
就很明显是动态生成且容易作为检测点了,这里Token
不需要关注,我们测试一下Authorization
,x-date
,结果如下:
- 保留
Authorization
,保留Token
,请求成功 - 保留
Authorization
,不保留Token
,请求失败 - 不保留
Authorization
,保留Token
,请求失败 - 不保留
Authorization
,不保留Token
,请求失败
结果两次测试结果可以确定Authorization
,Token
是检测点且两者之间存在关系。通过这种方法我们最终确定了接口的反爬机制,接下来就是如何破解它了。
逆向研究
这个站点没有特别的混淆,全局搜索x-date
直接锁定关键代码位置,它是一个原生的hmac-sha256
加密,加密文本就是x-date
,x-date
是UTC时间字符串
算法破解
import base64
import hashlib
import hmac
from datetime import datetime
import requests
def get_hmac_authorization():
hit_time = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
key = '1S7JzAkstxUV1g51IB22otDrwRkFxRJ3'.encode()
message = 'x-date: {}'.format(hit_time).encode()
hmac_sha256 = hmac.new(key, message, digestmod=hashlib.sha256)
hmac_digest = hmac_sha256.digest()
encrypt_result = base64.b64encode(hmac_digest).decode()
return {
'Authorization': 'hmac username="kdcpua", algorithm="hmac-sha256", headers="x-date", signature="{}"'.format(
encrypt_result),
'x-date': hit_time,
}
headers = {
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.9",
"Origin": "Origin",
"Referer": "Referer",
"Token": "undefined undefined",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
}
headers.update(get_hmac_authorization())
url = "url "
response = requests.post(url, headers=headers)
print(response.text)
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj