2014-04-01 187 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