此分享只用于学习用途,不作商业用途,如有得罪,请联系处置惩罚
反爬前置信息
站点: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)
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |