GET 请求适用于 Postman,但不适用于 Python

问题描述 投票:0回答:4

我有一个简单的 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

python c# python-requests postman httpclient
4个回答
1
投票

仅使用“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)

0
投票

看看

response.text
,你被屏蔽了

urllib
似乎有效

import urllib.request as request

url = "https://www.expedia.com/"
response = request.urlopen(url)
print(response.status) # 200

0
投票

如果一个请求在 Postman 中有效,而另一个请求在 Python(或其他)中无效,那么这些请求显然是不同的(因为 HTTP 是无状态的)。因此,我建议您检查您发送的具体内容并比较请求。例如,您可以使用 Responsler 来做到这一点。只需选择一个主机名并从 Postman 和 Python 发送请求即可。您可以直接看到差异。


0
投票

更新您的请求库。最后版本是 2.31.0 .

© www.soinside.com 2019 - 2024. All rights reserved.