[英]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()
但是,這將為每個請求創建一個新連接。 我建議使用另一個能夠重用連接的庫,例如httplib
或Request 。 它將減輕服務器的壓力並加快請求速度:
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()
我遇到了同樣的錯誤。 更改代碼從
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.