如何避免HTTP错误429(太多的请求)的Python

我正在尝试使用Pythonlogin到一个网站,并从几个网页收集信息,我得到以下错误:

Traceback (most recent call last): File "extract_test.py", line 43, in <module> response=br.open(v) File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 203, in open return self._mech_open(url, data, timeout=timeout) File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 255, in _mech_open raise response mechanize._response.httperror_seek_wrapper: HTTP Error 429: Unknown Response Code 

我用time.sleep() ,它的工作原理,但它似乎非智能和不可靠的,有没有其他方法来躲避这个错误?

这是我的代码:

 import mechanize import cookielib import re first=("example.com/page1") second=("example.com/page2") third=("example.com/page3") fourth=("example.com/page4") ## I have seven URL's I want to open urls_list=[first,second,third,fourth] br = mechanize.Browser() # Cookie Jar cj = cookielib.LWPCookieJar() br.set_cookiejar(cj) # Browser options br.set_handle_equiv(True) br.set_handle_redirect(True) br.set_handle_referer(True) br.set_handle_robots(False) # Log in credentials br.open("example.com") br.select_form(nr=0) br["username"] = "username" br["password"] = "password" br.submit() for url in urls_list: br.open(url) print re.findall("Some String") 

接收状态429 不是错误 ,而是另一台服务器“善意地”要求您停止发送垃圾邮件请求。 显然,你的请求率太高,服务器不愿意接受。

你不应该试图“躲避”这个,甚至试图通过欺骗你的IP来绕过服务器安全设置,你应该简单地尊重服务器的答案,不要发送太多的请求。

如果一切设置正确,您还将收到“Retry-after”标题以及429响应。 此标头指定在进行另一个呼叫之前应等待的秒数。 处理这个“问题”的正确方法是阅读这个头文件并且让你的程序睡上好几秒钟。

你可以在这里find关于429状态的更多信息: http : //tools.ietf.org/html/rfc6585#page-3

写这段代码解决了我的问题:

requests.get(link, headers = {'User-agent': 'your bot 0.1'})

另一个解决方法是使用某种公共VPN或Tornetworking来欺骗你的IP。 这将假定在IP级别的服务器上的速率限制。

有一个简短的博客文章展示了使用tor和urllib2的方法:

http://blog.flip-edesign.com/?p=119