[solved]Link öffnet sich im Browser, urllib liefert 404

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
johnnyW
User
Beiträge: 3
Registriert: Donnerstag 21. August 2008, 12:52

Hi,

ich habe ein Problem mit Python, genauer gesagt damit eine Datei von einer Webseite zu laden. Öffne ich den Link im Browser wird die Datei gefunden, mit urllib.urlopen oder -retrieve bekomme ich einen 404-Fehler.
Den bekomme ich auch mit wget, also scheint der Webserver wohl ein cookie oder so zu setzen oder die Browser-ID abzufragen. Hat jemand eine Idee wie ich herausfinden kann was der Server abfragt und wie ich das mit Python machen kann?

Den konkreten Link möchte ich nicht posten, aber wenn jemand den Link unbedingt braucht dann bitte PN an mich.

Danke!
Zuletzt geändert von johnnyW am Donnerstag 21. August 2008, 17:04, insgesamt 1-mal geändert.
BlackJack

Du könntest mit Firefox und dem `Live HTTP Headers`-Plugin mal schauen was da so an Headerdaten zwischen Browser und Server ausgetauscht wird.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo johnnyW, willkommen im Forum,

Bist du sicher, dass die Seite die du ansurfst nicht tatsächlich einen 404-Fehler ausgibt? Denn 404-Fehler können, wie wohl die meisten Statuscodes (mal von 204 No Content abgesehen) durchaus einen Inhalt besitzen, der dann im Browser angezeigt werden kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
johnnyW
User
Beiträge: 3
Registriert: Donnerstag 21. August 2008, 12:52

Hi,

ja, ich bin sicher. Ich füge den link in Opera ein und die Grafik (ist eine Grafik die ich herunterladen möchte) wird angezeigt. In Python bekomme ich eine html-Datei die die 404-Fehlermeldung enthält:

Code: Alles auswählen

In [141]: test = urllib.urlopen( 'http://#############.jpg' )
In [142]: test.readlines()
Out[142]:
['<HTML>\n',
 '<HEAD>\n',
 '<TITLE>404 Not Found</TITLE>\n',
 '</HEAD>\n',
 '<BODY>\n',
 '<H1>Not Found</H1>\n',
 'The requested document was not found on this server.\n',
 '<P>\n',
 '<HR>\n',
 '<ADDRESS>\n',
 'Web Server at ########.com\n',
 '</ADDRESS>\n',
 '</BODY>\n',
 '</HTML>\n',
 '\n',
 '<!--\n',
 '   - Unfortunately, Microsoft has added a clever new\n',
 '   - "feature" to Internet Explorer. If the text of\n',
 '   - an error\'s message is "too small", specifically\n',
 '   - less than 512 bytes, Internet Explorer returns\n',
 '   - its own error message. You can turn that off,\n',
 "   - but it's pretty tricky to find switch called\n",
 '   - "smart error messages". That means, of course,\n',
 '   - that short error messages are censored by default.\n',
 '   - IIS always returns error messages that are long\n',
 '   - enough to make Internet Explorer happy. The\n',
 '   - workaround is pretty simple: pad the error\n',
 '   - message with a big comment like this to push it\n',
 '   - over the five hundred and twelve bytes minimum.\n',
 "   - Of course, that's exactly what you're reading\n",
 '   - right now.\n',
 '   -->\n']

In [143]:
##### hab ich eingefügt um den Link zu verstecken.
Firefox möchte ich ungern extra installieren, ich schau mal obs sowas vll auch für Opera gibt. Danke für die Tips.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Der Kommentar in der Fehlermeldung ist ja genial. :lol:
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
johnnyW
User
Beiträge: 3
Registriert: Donnerstag 21. August 2008, 12:52

Ok, ich hab das Problem gelöst. Der Referer im HTMLHeader muss gesetzt sein. Das klappt mir urllib2 ganz gut:

Code: Alles auswählen

        req = urllib2.Request( link )
        req.add_header('Referer', url )
        r = urllib2.urlopen(req)
Muss dann nur noch den urlrequest in das File dumpen und hab mein Image.

Btw, für Opera gabs kein LiveHTTPHeader bzw den dens gab der geht nicht mit der aktuellen Version *g*. Mit Firefox gings prima und hatte auch direkt die Lösung.
Antworten