Python request.get 无法获得我可以在浏览器上打开的 url 的答案

ASj*_*ASj 9 python python-requests

我正在学习如何使用 python 请求(Python 3),我正在尝试制作一个简单的 requests.get 从几个网站获取 HTML 代码。尽管它适用于大多数人,但我遇到了麻烦。

当我打电话时:http : //es.rs-online.com/一切正常:

In [1]: import requests
   ...:html = requests.get("http://es.rs-online.com/")
In [2]:html
Out[2]: <Response [200]>
Run Code Online (Sandbox Code Playgroud)

但是,当我使用http://es.farnell.com/尝试它时,python 无法解析地址并一直在处理它。如果我设置了超时,无论多长时间,requests.get()都将始终被超时中断,而不会被其他任何事情中断。我也尝试添加标题,但它没有解决问题。此外,我认为该错误与我使用的代理无关,因为我可以在浏览器中打开该网站。目前,我的代码如下所示:

import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36'}
html = requests.get("http://es.farnell.com/",headers=headers, timeout=5, allow_redirects = True )
Run Code Online (Sandbox Code Playgroud)

5 秒后,我收到预期的超时通知。

ReadTimeout: HTTPConnectionPool(host='es.farnell.com', port=80): Read timed out. (read timeout=5)
Run Code Online (Sandbox Code Playgroud)

有谁知道可能是什么问题?

Foz*_*oro 21

问题出在您的标题中。请记住,当涉及到您发送的标题内容时,某些站点比其他站点更宽松。为了解决这个问题,您应该将当前的标题替换为:

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36', "Upgrade-Insecure-Requests": "1","DNT": "1","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language": "en-US,en;q=0.5","Accept-Encoding": "gzip, deflate"}
Run Code Online (Sandbox Code Playgroud)

我还建议您将 get 请求发送到https://es.farnell.com/而不是http://es.farnell.com/, remove thetimeout = 5和 remove allow_redirects = True (因为它默认为 True )


总而言之,您的代码应如下所示:

import requests


headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36', "Upgrade-Insecure-Requests": "1","DNT": "1","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language": "en-US,en;q=0.5","Accept-Encoding": "gzip, deflate"}
html = requests.get("https://es.farnell.com",headers=headers)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。