我有一个简单的 GET 请求,只有 2 个标头,在邮递员上工作得非常好。 但是当我尝试使用 Curl 或 Python3.9 进行相同操作时,它不起作用。 有人可以帮我理解 Python 有什么问题吗?
这是 Curl - 在邮递员上运行良好 - 响应是 200
curl --location 'https://www.expedia.com/' \
--header 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
这是 python3.9 代码: - 响应是 429
import requests
url = "https://www.expedia.com/"
payload = {}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
'host':'www.expedia.com'
}
response = requests.get(url, headers=headers, data=payload)
print(response.status_code)
我也用 C# 尝试过同样的方法,它就像魔术一样工作 - 响应 200
仅使用“User-Agent”标头: 在 Python 代码中,不需要单独指定“host”标头。 “host”标头通常由请求库自动处理。从代码中删除“host”标头:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
}
使用“--location”标志等效项: cURL 中的“--location”标志自动遵循重定向。在Python代码中,您可以使用allow_redirects参数来实现相同的行为:
response = requests.get(url, headers=headers, data=payload, allow_redirects=True)
在您的 Python 代码中尝试这些调整:
import requests
url = "https://www.expedia.com/"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers, allow_redirects=True)
print(response.status_code)
如果一个请求在 Postman 中有效,而另一个请求在 Python(或其他)中无效,那么这些请求显然是不同的(因为 HTTP 是无状态的)。因此,我建议您检查您发送的具体内容并比较请求。例如,您可以使用 Responsler 来做到这一点。只需选择一个主机名并从 Postman 和 Python 发送请求即可。您可以直接看到差异。
更新您的请求库。最后版本是 2.31.0 .