10

だから私はサブredditsのリストを持っていて、それらを開くためにurllibを使用しています。それらを調べてみると、最終的に urllib は次のように失敗します。

urllib2.HTTPError: HTTP Error 429: Unknown

いくつかの調査を行ったところ、reddit はサーバーへのリクエストの量を IP で制限していることがわかりました。

リクエストは 2 秒ごとに 1 つまでにしてください。リクエストのバーストにはある程度の許容範囲がありますが、それを正常に保ちます。一般に、1 分間に 30 件を超えないようにしてください。

そこでtime.sleep()、リクエストを 10 秒ごとに 1 ページに制限することにしました。これも同様に失敗します。

上記の引用は、reddit APIページから取得したものです。reddit API は使用していません。この時点で、私は2つのことを考えています。その制限が reddit API にのみ適用されるか、urllib にも制限があります。

この2つのうちどちらかわかる方いますか?または、どうすればこの問題を回避できますか?

4

3 に答える 3

19

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()
于 2012-11-03T22:13:41.820 に答える
5

reddit は、IP アドレスとユーザー エージェントの両方に対して、要求によるレート制限を実行します (Anonymous Coward によって提案された接続ではありません)。あなたが直面している問題は、urllib2 を使用して reddit にアクセスしようとするすべてのユーザーが、1 人のユーザーとしてレート制限されることです。

解決策は、この質問で答えを見つけることができるユーザー エージェントを設定することです。

または、reddit をクロールする独自のコードを書くのをやめて、代わりに PRAWを使用します。reddit の API のほぼすべての機能をサポートしており、API ルールに従うことを心配する必要はありません。

于 2012-11-04T07:08:07.967 に答える