2012-11-03 3 views
8

So habe ich eine Liste von Unterreddits und ich benutze Urllib, um sie zu öffnen. Als ich durch sie gehen schließlich nicht urllib mit:urllib2 HTTP-Fehler 429

urllib2.HTTPError: HTTP Error 429: Unknown 

einige der Forschung fand ich, dass reddit die ammount von Anfragen an die Server von IP begrenzt:

nicht mehr Stellen als eine Anforderung alle zwei Sekunden . Es gibt einige Freiheiten für Anfragen, aber behalten Sie es gesund. Im Allgemeinen sollten Sie nicht mehr als 30 Anfragen in einer Minute einhalten.

Also dachte ich, ich würde time.sleep() verwenden, um meine Anfragen auf eine Seite alle 10 Sekunden zu begrenzen. Dies endet genauso gut.

Das obige Zitat stammt von der reddit API Seite. Ich benutze nicht die reddit API. An diesem Punkt denke ich zwei Dinge. Entweder gilt dieses Limit nur für die reddit-API oder urlib hat auch eine Beschränkung.

Weiß jemand, welches dieser beiden Dinge es ist? Oder wie könnte ich dieses Problem umgehen?

+3

Es gibt keine Begrenzung in 'urllib2', wie Sie durch das Testen einer anderen Webseite herausgefunden haben könnten. Möglicherweise haben sie Ihre IP-Adresse vom API-Zugriff blockiert. Senden Sie ihnen eine E-Mail. –

+0

@larsmans Die Requests durchlaufen zufällig. Ich bekomme ein paar, dann scheitert es eine Weile und dann funktioniert es wieder. Außerdem konnten sie mich nicht von ihrer API blockieren, da ich ihre API nicht verwende. –

Antwort

16

Von https://github.com/reddit/reddit/wiki/API:

Viele Standard-User-Agents (wie "Python/urllib" oder "Java") werden drastisch eingeschränkt einzigartig und beschreibende User-Agent-Strings zu fördern.

Dies gilt auch für reguläre Anfragen. Sie müssen Ihren eigenen User-Agent-Header angeben, wenn Sie die Anfrage stellen.

#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() 

Dies wird jedoch eine neue Verbindung für jede Anfrage erstellen. Ich empfehle, eine andere Bibliothek zu verwenden, die Verbindungen wiederverwenden kann, zum Beispiel httplib oder Request. Es wird weniger Druck auf den Server gestellt und die Anfragen beschleunigen:

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() 
+0

Der einzige Grund, warum dies scheinbar funktioniert, ist, dass Sie keinen gemeinsamen Benutzeragenten verwenden. Nach den API-Regeln müssen Sie jedoch immer noch einen eindeutigen Benutzeragenten einrichten, und diese Lösung kann schließlich dazu führen, dass Sie 429 Fehler erhalten. – bboe

+0

Vielen Dank für die Korrektur meiner falschen Einschätzung. Ich habe meine Antwort geändert, um dies zu reflektieren. –

4

reddit führt Rate auf Wunsch (nicht Verbindung als suggested von Anonymous Coward) für beide IP-Adressen und Benutzeragenten zu begrenzen. Das Problem, mit dem Sie konfrontiert werden, ist, dass jeder, der versucht, mit urllib2 auf reddit zuzugreifen, als einzelner Benutzer ratenbegrenzt ist.

Die Lösung besteht darin, einen Benutzer-Agent zu setzen, der eine Antwort in this question finden kann.

Oder vergessen Sie nicht, Ihren eigenen Code zu schreiben, um reddit zu crawlen und PRAW instead zu verwenden. Es unterstützt fast alle Funktionen von reddit's API und Sie müssen sich nicht darum kümmern, irgendwelchen API-Regeln zu folgen, da es das für Sie erledigt.

+0

Dank bboe.Ich habe dich im reddit IRC erwischt und du hast mir von PRAW erzählt. Prost nochmal. –