所以,我已经抓取一个页面大约一年了,从上周开始,每次我尝试使用 python-requests 连接到它时,我都开始收到 HTTP 代码 403。
从我的网络浏览器和curl 来看,完全没有问题。因此,我假设问题是在发送 HTTP 数据包之前进行了某种验证,并通过 WireShark 分析数据包,我可以看到发送 HTTP 数据包之前进行的 TLS 握手有一些细微的差异。
我想做的是对连接上使用的握手进行一些基本更改。例如,与 python 和我的curl/Web 浏览器明显不同的事情之一是,python/OPENSSL 似乎总是在握手中添加填充,而其他 2 个则不会(curl/Web 浏览器)。
是否有任何方法可以更改,例如通过请求中的某些选项在 TLS 握手上使用填充?如果不是,如何通过修改对 SSL 源代码或任何其他库的某种调用来做到这一点?
这是给出 403 错误的 python-requests 代码:
import requests
s = requests.session()
s.headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'pt-BR,pt;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'DNT': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
}
response = s.get(
'https://www63.bb.com.br/portalbb/djo/id/resgate/dadosResgate.bbx'
)
这是一个不会给出 403 并让我到达我想要的页面的卷曲:
curl "https://www63.bb.com.br/portalbb/djo/id/resgate/dadosResgate.bbx" ^
-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" ^
-H "Accept-Language: pt-BR,pt;q=0.9" ^
-H "Cache-Control: max-age=0" ^
-H "Connection: keep-alive" ^
-H "DNT: 1" ^
-H "Sec-Fetch-Dest: document" ^
-H "Sec-Fetch-Mode: navigate" ^
-H "Sec-Fetch-Site: none" ^
-H "Sec-Fetch-User: ?1" ^
-H "Upgrade-Insecure-Requests: 1" ^
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36" ^
-H "sec-ch-ua: \"Chromium\";v=\"130\", \"Google Chrome\";v=\"130\", \"Not?A_Brand\";v=\"99\"" ^
-H "sec-ch-ua-mobile: ?0" ^
-H "sec-ch-ua-platform: \"Windows\""
我已经尝试过查看请求和 SSL 模块源代码,但找不到任何有关 TLS 握手配置的有用信息。
本站使用Cloudflare Cloudflare Bot Fight模式,需要使用TLS Client,尝试使用TLS Requests绕过。
pip install wrapper-tls-requests
示例
import tls_requests
r = tls_requests.get('https://www63.bb.com.br/portalbb/djo/id/resgate/dadosResgate.bbx')
print(r) # <Response [200]>