2013-02-13 10 views
5

Diese Shell Befehl erfolgreichHTTP 403 Fehler Abrufen robots.txt mit 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 

und robots.txt druckt. Das Weglassen der Benutzer-Agent-Option führt zu einem 403-Fehler vom Server. Die Überprüfung der robots.txt-Datei zeigt, dass der Inhalt unter http://www.fifa-infinity.com/board zum Crawlen zugelassen ist. die folgenden fehlschlägt (Python-Code) jedoch:

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') 

Und die Ausgabe auf meiner Konsole ist:

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 

Merkwürdigerweise curl verwenden, ohne die User-Agent-Ergebnisse Einstellung in "403: Verboten" eher als "403: Schlechtes Verhalten".

Bin ich irgendwie etwas falsch gemacht, oder ist das ein Fehler in mechanize/urllib2? Ich sehe nicht, wie einfach robots.txt "schlechtes Verhalten" sein kann?

+0

Und ein weiteres Beispiel für Kopf Sniffing schlecht gegangen. Der Server auf der anderen Seite schaut mehr auf den UA-Agenten, überprüft, welche Header "curl" senden, vergleicht sie mit dem, was "mechanize" benutzt, justiert, rince, repeat. Das ist * kein * Python-Problem. –

+0

Dieses Problem sieht ahnlich ähnlich zu [urllib2.HTTPError: HTTP Error 403: Forbidden] (https://stackoverflow.com/questions/13303449/urllib2-httperror-http-error-403-forbidden/46213623#46213623) – djinn

Antwort

9

Wie im Test verifiziert, müssen Sie einen Header Accept hinzufügen, um akzeptable Inhaltstypen anzugeben (jeder Typ wird dies tun, solange der Header "Accept" existiert). Zum Beispiel funktioniert es nach dem Wechsel:

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

zu:

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

Danke, Das war's! – Moshev

+0

Ich wünschte ich hätte das früher gesehen ... Es hätte mir Stunden Arbeit erspart! Danke Hui! –