为何Python Requests请求正常但Curl请求返回403错误?
问题:Curl请求返回403但Python Requests正常,是否Requests自动添加额外请求头?
我尝试使用Curl请求链接https://dooood.com/d/h9rojbkqnpan时返回403错误,但使用Python的Requests库携带相同请求头请求该链接却能正常工作。
Python代码
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 OPR/67.0.3575.97', 'Referer': 'https://dooood.com/'} url = "https://dooood.com/d/h9rojbkqnpan" res = requests.get('https://dooood.com/d/h9rojbkqnpan', headers=headers) print(res.content) print(res.status_code)
Curl命令
curl -I "https://dooood.com/d/h9rojbkqnpan" \ -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 OPR/67.0.3575.97" \ -H "Referer: https://dooood.com/"
回答
是的,Python Requests会自动添加一些默认请求头,这大概率是导致两者请求结果差异的原因。
Requests在发送请求时,除了你手动设置的头,还会默认带上以下常见字段:
Accept-Encoding: 通常为gzip, deflate, brAccept: 默认值为*/*Connection: 默认值为keep-alive
你的Curl命令里没有包含这些头,目标网站的反爬机制可能会检查这些必要的请求头字段,缺少时就返回403错误。
你可以通过两种方式验证这个结论:
- 在Python代码中打印实际发送的请求头,查看额外添加的内容:
print(res.request.headers) - 将这些额外的请求头添加到Curl命令中,重新测试是否能正常返回:
curl -I "https://dooood.com/d/h9rojbkqnpan" \ -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 OPR/67.0.3575.97" \ -H "Referer: https://dooood.com/" \ -H "Accept-Encoding: gzip, deflate, br" \ -H "Accept: */*" \ -H "Connection: keep-alive"
内容的提问来源于stack exchange,提问作者linkkader
相关产品推荐
相关产品推荐

