2014-04-01 233 views
42

我试图使用Python登录到一个网站,并从多个网页中收集信息,我得到以下错误:如何避免HTTP错误429(太多请求)蟒蛇

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") 
+5

有没有办法解决它,这是对服务器 - 执法侧面跟踪您制作多少个请求/时间单位。如果你超过这个单位,你会被暂时封锁。有些服务器在标题中发送这些信息,但这些情况很少见。 检查从服务器收到的标题,使用可用的信息..如果不是,请检查您能够多快地敲打而不会被抓到并使用“睡眠”。 – Torxed

+1

http://stackoverflow.com/questions/15648272/how-do-you-view-the-request-headers-that-mechanize-is-using – Torxed

回答

6

另一个解决办法是使用某种公共VPN或Tor网络的欺骗你的IP。这将假定IP级服务器上的速率限制。

有一个简短的博客文章展示了一种与urllib2的一起使用Tor:

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

78

接收状态429是不是错误,这是其他服务器的“好心”问你请停止发送垃圾邮件请求。显然,你的请求率太高,服务器不愿意接受。

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

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

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

+5

我刚刚得到了我的第一次请求429 .. – geotheory

+9

那么,从来没有人说过所有的Web服务器都配置正确。另外,由于大多数限速器都是通过IP来识别访问者,所以这可能会导致在动态共享IP的情况下出现问题。如果您保持接收状态429,尽管您确信您没有发送过多请求,您可以考虑联系该网站的管理员。 – MRA

10

写这一段代码固定我的问题:

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

+5

这个答案是downvoted,但如果用户代理被滥用从其他人禁止,一些网站会自动返回错误代码429。如果即使您只发送了几个请求,也会收到错误代码429,请尝试将用户代理设置为其他内容。 –

+1

还想补充一些网站明确拒绝请求,除非发送用户代理,并且您可能会得到无数其他响应:503/403 /某些通用索引页。 – user3791372