2014-04-01 15 views
42

Próbuję użyć Pythona, aby zalogować się na stronie i zbierać informacje z kilku stron i pojawia się następujący błąd:Jak uniknąć błędu HTTP 429 (zbyt wiele żądań) python

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 

użyłem time.sleep() i działa, ale wydaje się nieinteligentny i niewiarygodny, czy istnieje inny sposób na uniknięcie tego błędu?

Oto mój kod:

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

Nie ma sposobu, wokół niego, jest to wykonanie na server- boczne śledzenie liczby żądań/jednostek czasu. Jeśli przekroczysz tę jednostkę, zostaniesz tymczasowo zablokowany. Niektóre serwery wysyłają tę informację w nagłówku, ale te okazje są rzadkie. Sprawdź nagłówki otrzymane od serwera, skorzystaj z dostępnych informacji. Jeśli nie, sprawdź, jak szybko możesz młotkować bez złapania i użyć funkcji "uśpienia". – Torxed

+1

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

Odpowiedz

6

Innym Rozwiązaniem byłoby sfałszować swój adres IP za pomocą jakiegoś VPN Publicznej lub sieci Tor. Zakładałoby to ograniczenie szybkości na serwerze na poziomie IP.

Jest krótki blogu demonstrując sposób używają Tora wraz z urllib2:

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

78

Otrzymanie statusu 429 jest nie błąd, jest inny serwer „łaskawie” z prośbą proszę, przestań wysyłać spam. Oczywiście twoja stawka żądań była zbyt wysoka i serwer nie chce tego zaakceptować.

Nie powinieneś próbować tego "unikać", a nawet próbować ominąć ustawienia bezpieczeństwa serwera, próbując podrobić IP, powinieneś po prostu uszanować odpowiedź serwera, nie wysyłając zbyt wielu żądań.

Jeśli wszystko jest ustawione poprawnie, otrzymasz również nagłówek "Ponów po" wraz z odpowiedzią 429. Ten nagłówek określa liczbę sekund, które powinieneś poczekać przed kolejnym połączeniem. Właściwym sposobem radzenia sobie z tym "problemem" jest przeczytanie tego nagłówka i spanie procesu przez wiele sekund.

można znaleźć więcej informacji na temat statusu 429 tutaj: http://tools.ietf.org/html/rfc6585#page-3

+5

Właśnie dostałem 429 na mojej pierwszej prośbie ... – geotheory

+9

Cóż, nikt nigdy nie powiedział, że wszystkie serwery internetowe są poprawnie skonfigurowane. Ponadto, ponieważ większość ograniczników stawek identyfikuje użytkowników według adresów IP, może to prowadzić do problemów w scenariuszu, w którym adresy IP są współużytkowane dynamicznie. Jeśli nadal otrzymujesz status 429, mimo że masz pewność, że nie wysłałeś zbyt wielu żądań, możesz skontaktować się z administratorem witryny. – MRA

10

pisząc ten kawałek kodu stały mój problem:

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

+5

Ta odpowiedź jest anulowana, ale niektóre witryny automatycznie zwracają kod błędu 429, jeśli agent użytkownika jest zbanowany z powodu nadużycia ze strony innych osób. Jeśli pojawi się kod błędu 429, nawet jeśli wysłano tylko kilka żądań, spróbuj ustawić klienta użytkownika na coś innego. –

+1

Chciałbym dodać, że niektóre witryny wyraźnie odrzucają żądania, chyba że wysłany zostanie agent użytkownika, i możesz uzyskać niezliczoną ilość innych odpowiedzi: 503/403/ogólna strona indeksu. – user3791372