Python 机械化:打开 url 时网关超时,但 url 在 Internet 浏览器中打开正常
Python Mechanize: Gateway Time-out when opening url, but url opens fine in internet browser
我正在使用 Python (2.7) 机械化(在 Mac 上)从 expedia.co.uk 抓取酒店房间数据,循环遍历大约 1000 url' s(200 家酒店和 5 个不同时期)。
当我 运行 代码时,前 200 个代码运行良好,然后出现以下错误:
httperror_seek_wrapper: Gateway Time-out
从那以后,对于我尝试从 expedia 网站加载的任何内容,它总是给我这个错误,尽管从互联网 explorer/Chrome 打开相同的 url 工作正常。
这是一个示例代码:
import mechanize
from bs4 import BeautifulSoup
br = mechanize.Browser()
br.set_handle_refresh(False)
url = 'https://www.expedia.co.uk/Massena-Square-Hotels-Hotel-Aston-La-Scala.h53477.Hotel-Information?&rm1=a1&chkout=02/12/2016&chkin=01/12/2016'
r = br.open(url, timeout = 2.0)
soup = BeautifulSoup(r,'lxml')
这是追溯:
Traceback (most recent call last):
File "", line 5, in
r = br.open(url, timeout = 2.0)
File "build/bdist.macosx-10.5-x86_64/egg/mechanize/_mechanize.py", line 203, in open
return self._mech_open(url, data, timeout=timeout)
File "build/bdist.macosx-10.5-x86_64/egg/mechanize/_mechanize.py", line 255, in _mech_open
raise response
httperror_seek_wrapper: Gateway Time-out
我尝试了不同的超时时间,并使用了不同的 IP 地址,同样的错误。有什么解决办法吗?
我可以使用以下方法消除超时错误:
br.addheaders.append(
('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9')
)
如果您打印出 mechanize headers 用于对随机网站的简单请求,您会看到类似这样的内容:
import mechanize
br = mechanize.Browser()
br.set_handle_refresh(False)
url = 'http://www.example.com'
r = br.open(url, timeout = 2.0)
request = br.request
print(request.header_items())
--output:--
[('Host', 'www.example.com'), ('User-agent', 'Python-urllib/2.7')]
默认的 mechanize headers 将请求识别为由计算机程序 'Python-urllib/2.7' 发送,网站不认可。
如果您使用浏览器的开发者工具,您可以检查浏览器发送给您的 url 的请求。在“网络”选项卡下,查看请求 headers,您会看到 headers 与默认机械化 headers 不同。在您的机械化请求中,您只需复制浏览器发送的 headers 。事实证明,如果您将请求标识为来自浏览器而不是 python 程序,那么请求将成功,而无需添加浏览器发送的任何其他 headers。
我正在使用 Python (2.7) 机械化(在 Mac 上)从 expedia.co.uk 抓取酒店房间数据,循环遍历大约 1000 url' s(200 家酒店和 5 个不同时期)。
当我 运行 代码时,前 200 个代码运行良好,然后出现以下错误:
httperror_seek_wrapper: Gateway Time-out
从那以后,对于我尝试从 expedia 网站加载的任何内容,它总是给我这个错误,尽管从互联网 explorer/Chrome 打开相同的 url 工作正常。
这是一个示例代码:
import mechanize from bs4 import BeautifulSoup br = mechanize.Browser() br.set_handle_refresh(False) url = 'https://www.expedia.co.uk/Massena-Square-Hotels-Hotel-Aston-La-Scala.h53477.Hotel-Information?&rm1=a1&chkout=02/12/2016&chkin=01/12/2016' r = br.open(url, timeout = 2.0) soup = BeautifulSoup(r,'lxml')
这是追溯:
Traceback (most recent call last):
File "", line 5, in r = br.open(url, timeout = 2.0)
File "build/bdist.macosx-10.5-x86_64/egg/mechanize/_mechanize.py", line 203, in open return self._mech_open(url, data, timeout=timeout)
File "build/bdist.macosx-10.5-x86_64/egg/mechanize/_mechanize.py", line 255, in _mech_open raise response
httperror_seek_wrapper: Gateway Time-out
我尝试了不同的超时时间,并使用了不同的 IP 地址,同样的错误。有什么解决办法吗?
我可以使用以下方法消除超时错误:
br.addheaders.append(
('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9')
)
如果您打印出 mechanize headers 用于对随机网站的简单请求,您会看到类似这样的内容:
import mechanize
br = mechanize.Browser()
br.set_handle_refresh(False)
url = 'http://www.example.com'
r = br.open(url, timeout = 2.0)
request = br.request
print(request.header_items())
--output:--
[('Host', 'www.example.com'), ('User-agent', 'Python-urllib/2.7')]
默认的 mechanize headers 将请求识别为由计算机程序 'Python-urllib/2.7' 发送,网站不认可。
如果您使用浏览器的开发者工具,您可以检查浏览器发送给您的 url 的请求。在“网络”选项卡下,查看请求 headers,您会看到 headers 与默认机械化 headers 不同。在您的机械化请求中,您只需复制浏览器发送的 headers 。事实证明,如果您将请求标识为来自浏览器而不是 python 程序,那么请求将成功,而无需添加浏览器发送的任何其他 headers。