簡體   English   中英

urllib2 HTTP 錯誤 429

[英]urllib2 HTTP error 429

所以我有一個 sub-reddits 列表,我正在使用 urllib 打開它們。 當我通過它們時,最終 urllib 失敗了:

urllib2.HTTPError: HTTP Error 429: Unknown

做了一些研究,我發現 reddit 通過 IP 限制了對其服務器的請求量:

每兩秒發出不超過一個請求。 允許突發請求,但要保持理智。 一般來說,保持在一分鍾內不超過 30 個請求。

所以我想我會使用time.sleep()將我的請求限制為每 10 秒一頁。 這最終也會失敗。

上面的引文摘自reddit API頁面。 我沒有使用 reddit API。 在這一點上,我在想兩件事。 該限制僅適用於 reddit API 或 urllib 也有限制。

有誰知道這兩種東西中的哪一種? 或者我該如何解決這個問題?

來自https://github.com/reddit/reddit/wiki/API

許多默認的用戶代理(如“Python/urllib”或“Java”)被極大地限制為鼓勵唯一和描述性的用戶代理字符串。

這也適用於常規請求。 發出請求時,您需要提供自己的用戶代理標頭。

#TODO: change user agent string
hdr = { 'User-Agent' : 'super happy flair bot by /u/spladug' }
req = urllib2.Request(url, headers=hdr)
html = urllib2.urlopen(req).read()

但是,這將為每個請求創建一個新連接。 我建議使用另一個能夠重用連接的庫,例如httplibRequest 它將減輕服務器的壓力並加快請求速度:

import httplib
import time

lst = """
science
scifi
"""

hdr= { 'User-Agent' : 'super happy flair bot by /u/spladug' }
conn = httplib.HTTPConnection('www.reddit.com')
for name in lst.split():
    conn.request('GET', '/r/'+name, headers=hdr)
    print conn.getresponse().read()
    time.sleep(2)
conn.close()

reddit 通過請求(而不是 Anonymous Coward建議的連接)對 IP 地址和用戶代理執行速率限制。 您遇到的問題是,嘗試使用 urllib2 訪問 reddit 的每個人都將被限制為單個用戶。

解決方案是設置一個用戶代理,您可以在此問題中找到答案。

或者,放棄編寫自己的代碼來抓取 reddit 並改用PRAW 它支持 reddit 的 API 的幾乎所有功能,您無需擔心遵循任何 API 規則,因為它會為您處理這些。

我遇到了同樣的錯誤。 更改代碼從

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen(url)
bsObj = BeautifulSoup(html)

from urllib.request import urlopen
from bs4 import BeautifulSoup
import urllib.request

webRequest = urllib.request.Request(url, headers={"User-Agent": <you username in case you are scraping reddit>})
html = urlopen(webRequest)
bsObj = BeautifulSoup(html)

解決了問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM