Python Mechanize:打开url时网关超时,但url在internet浏览器中可以正常打开

Python Mechanize:打开url时网关超时,但url在internet浏览器中可以正常打开,python,mechanize,Python,Mechanize,我正在使用Python(2.7)mechanize(在Mac上)从expedia.co.uk中抓取酒店房间数据,循环浏览大约1000个url的列表(200家酒店和5个不同的时段) 当我运行代码时,它在前200个小时运行良好,然后给了我以下错误: httperror\u seek\u包装器:网关超时 从那时起,无论我试图从expedia网站加载什么,它总是给我这个错误,尽管从internet explorer/Chrome打开相同的url也可以 下面是一个示例代码: 这是回溯: 回溯(最近一次呼叫

我正在使用Python(2.7)mechanize(在Mac上)从expedia.co.uk中抓取酒店房间数据,循环浏览大约1000个url的列表(200家酒店和5个不同的时段)

当我运行代码时,它在前200个小时运行良好,然后给了我以下错误:

httperror\u seek\u包装器:网关超时

从那时起,无论我试图从expedia网站加载什么,它总是给我这个错误,尽管从internet explorer/Chrome打开相同的url也可以

下面是一个示例代码:

这是回溯:

回溯(最近一次呼叫最后一次):

文件“”,第5行,在 r=br.open(url,超时=2.0)

文件“build/bdist.macosx-10.5-x86_64/egg/mechanize/_mechanize.py”,第203行,打开 返回self.\u mech\u open(url、数据、超时=超时)

文件“build/bdist.macosx-10.5-x86_64/egg/mechanize/_mechanize.py”,第255行,在打开的 提出回应

httperror\u seek\u包装器:网关超时


我尝试了不同的超时,使用不同的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标题,您将看到如下内容:

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标头将请求标识为由计算机程序“Python urllib/2.7”发送,而网站不批准该程序


如果使用浏览器的开发人员工具,则可以检查浏览器发送到url的请求。在“网络”选项卡下,查看请求标头,您将看到与默认mechanize标头不同的标头。在mechanize请求中,只需复制浏览器发送的标题。事实证明,如果您将请求标识为来自浏览器而不是python程序,则请求将成功,而不添加浏览器发送的任何其他头。

减慢DoS攻击速度
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')]