2014-04-01 14 views
42

Sto cercando di usare Python per accedere a un sito web e raccogliere informazioni da diverse pagine web e ottengo il seguente errore:Come evitare l'errore HTTP 429 (troppe richieste) pitone

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 

ho usato time.sleep() e funziona, ma sembra non intelligente e inaffidabile, c'è qualche altro modo per evitare questo errore?

Ecco il mio codice:

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

Non c'è niente da fare, questo è un applicazione sul server- lato tenendo traccia di quante richieste/unità di tempo effettuate. Se superi questa unità, sarai temporaneamente bloccato. Alcuni server inviano queste informazioni nell'intestazione, ma quelle occasioni sono rare. Controlla le intestazioni ricevute dal server, usa le informazioni disponibili .. In caso contrario, controlla quanto velocemente puoi martellare senza essere scoperti e usa un "sonno". – Torxed

+1

http://stackoverflow.com/questions/15648272/how-do-you-view-the-request-headers-that-mechanize-is-using – Torxed

risposta

6

Un'altra soluzione potrebbe essere quella di falsificare il tuo IP utilizzando una sorta di VPN pubblica o la rete Tor. Ciò presupporrebbe la limitazione della velocità sul server a livello IP.

C'è una breve post sul blog dimostrazione di un modo per utilizzare Tor con urllib2:

http://blog.flip-edesign.com/?p=119

78

Ricevere uno status 429 è non un errore, è l'altro server "gentilmente" si chiede per favore smettere di richieste di spamming. Ovviamente, la tua percentuale di richieste è stata troppo alta e il server non è disposto ad accettarlo.

Non dovresti cercare di "schivare" questo, o anche cercare di eludere le impostazioni di sicurezza del server provando a falsificare il tuo IP, dovresti semplicemente rispettare la risposta del server non inviando troppe richieste.

Se tutto è impostato correttamente, si riceverà anche un'intestazione "Riprova dopo" insieme alla risposta 429. Questa intestazione specifica il numero di secondi che devi attendere prima di effettuare un'altra chiamata. Il modo corretto per affrontare questo "problema" è leggere questa intestazione e addormentare il processo per molti secondi.

È possibile trovare maggiori informazioni sullo stato 429 qui: http://tools.ietf.org/html/rfc6585#page-3

+5

Ho appena ricevuto un 429 sulla mia prima richiesta in assoluto .. – geotheory

+9

Bene, nessuno ha mai detto che tutti i server web siano configurati correttamente. Inoltre, poiché la maggior parte dei limitatori di velocità identificano i visitatori tramite IP, ciò potrebbe causare problemi in uno scenario in cui gli IP sono condivisi dinamicamente. Se continui a ricevere lo stato 429 anche se sei sicuro di non aver inviato troppe richieste, potresti prendere in considerazione di contattare l'amministratore del sito. – MRA

10

Scrivendo questo pezzo di codice fisso il mio problema:

requests.get(link, headers = {'User-agent': 'your bot 0.1'})

+5

Questa risposta è downvoted, ma alcuni siti restituiscono automaticamente il codice di errore 429 se l'utente è bannato a causa di abuso da parte di altre persone. Se ricevi il codice di errore 429 anche se hai inviato solo poche richieste, prova a impostare l'agente utente su qualcos'altro. –

+1

Vorrebbe anche aggiungere che alcuni siti rifiutano esplicitamente le richieste a meno che non venga inviato un utente-agente, e si può ottenere una miriade di altre risposte: 503/403/qualche pagina indice generica. – user3791372