2013-02-13 15 views
5

Komenda ta powłoka udaHTTP 403 podczas pobierania robots.txt o mechanize

$ curl -A "Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 (compatible;)" http://fifa-infinity.com/robots.txt 

i drukuje robots.txt. Pominięcie opcji user-agent powoduje błąd 403 z serwera. Sprawdzanie pliku robots.txt pokazuje, że treść pod numerem http://www.fifa-infinity.com/board jest dozwolona do indeksowania. Jednak po awarii (kod python):

import logging 
import mechanize 
from mechanize import Browser 

ua = 'Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 (compatible;)' 
br = Browser() 
br.addheaders = [('User-Agent', ua)] 
br.set_debug_http(True) 
br.set_debug_responses(True) 
logging.getLogger('mechanize').setLevel(logging.DEBUG) 
br.open('http://www.fifa-infinity.com/robots.txt') 

a wyjście na konsolę jest:

No handlers could be found for logger "mechanize.cookies" 
send: 'GET /robots.txt HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: www.fifa-infinity.com\r\nConnection: close\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 (compatible;)\r\n\r\n' 
reply: 'HTTP/1.1 403 Bad Behavior\r\n' 
header: Date: Wed, 13 Feb 2013 15:37:16 GMT 
header: Server: Apache 
header: X-Powered-By: PHP/5.2.17 
header: Vary: User-Agent,Accept-Encoding 
header: Connection: close 
header: Transfer-Encoding: chunked 
header: Content-Type: text/html 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/home/moshev/Projects/forumscrawler/lib/python2.7/site-packages/mechanize/_mechanize.py", line 203, in open 
    return self._mech_open(url, data, timeout=timeout) 
    File "/home/moshev/Projects/forumscrawler/lib/python2.7/site-packages/mechanize/_mechanize.py", line 255, in _mech_open 
    raise response 
mechanize._response.httperror_seek_wrapper: HTTP Error 403: Bad Behavior 

dziwne, używając zwijania bez ustawiania wyników User-Agent w "403: Forbidden" raczej niż "403: złe zachowanie".

Czy robię coś złego, czy jest to błąd w mechanize/urllib2? Nie rozumiem, jak po prostu pobieranie pliku robots.txt może być "złym zachowaniem"?

+0

I kolejny przykład nagłówka wąchania gone bad. Serwer po drugiej stronie patrzy bardziej na agenta UA, sprawdza, które nagłówki 'curl' wysyła, porównuj je z tym, co używa' mechanise', dostosuj, rince, powtórz. To nie jest problem z Pythonem. –

+0

Ten problem wygląda podobnie do [urllib2.HTTPError: HTTP Error 403: Forbidden] (https://stackoverflow.com/questions/13303449/urllib2-httperror-http-error-403-forbidden/46213623#46213623) – djinn

Odpowiedz

9

Jak zweryfikowano eksperymentalnie, należy dodać nagłówek Accept, aby określić akceptowalne typy zawartości (dowolny typ będzie taki, o ile istnieje nagłówek "Accept"). Na przykład, to będzie działać po zmianie:

br.addheaders = [('User-Agent', ua)] 

do:

br.addheaders = [('User-Agent', ua), ('Accept', '*/*')] 
+0

Dzięki, to było to! – Moshev

+0

Szkoda, że ​​nie widziałem tego wcześniej ... Oszczędziłoby mi to godzin pracy! Dzięki Hui! –

Powiązane problemy