Browser öffnet url, urllib2 nicht !?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hallo,

Die Browser öffnen die folgende url, urllib2 nicht. Da bin ich jetzt mal ratlos !?

http://www.playlist.com/searchbeta/trac ... 0Sistema/1

Fehlermeldung:

Code: Alles auswählen

u = urllib2.urlopen('http://www.playlist.com/searchbeta/tracks#Buraka%20Som%20Sistema/1')
  File "C:\Programme\Python25\lib\urllib2.py", line 124, in urlopen
    return _opener.open(url, data)
  File "C:\Programme\Python25\lib\urllib2.py", line 387, in open
    response = meth(req, response)
  File "C:\Programme\Python25\lib\urllib2.py", line 498, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Programme\Python25\lib\urllib2.py", line 425, in error
    return self._call_chain(*args)
  File "C:\Programme\Python25\lib\urllib2.py", line 360, in _call_chain
    result = func(*args)
  File "C:\Programme\Python25\lib\urllib2.py", line 506, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found
Gruss, Seven
BlackJack

Mit Leerzeichen anstelle von %20 geht's. `urllib2` nimmt halt nur "unkodierte" URLs. Ich denke mal Browser müssen an der Stelle raten, oder probieren einfach beides aus!?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Dann verhält sich aber doch eigentlich urllib2 falsch. Ohne %20 mit Leerzeichen ist das keine syntaktisch korrekte URL. Die Doku gibt auch keinen Hinweis, dass urllib2.urlopen den String noch mal URL-encoded. Im Gegenteil, da steht etwas von "valid URL".

Im Bug-Tracker habe ich eben gelesen, dass Python 2.x die Strings zu URLs encoded während Python 3.x eine korrekte URL erwartet. Subtiler Unterschied ;)

Stefan
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

@sma: Dann erkläre mir doch mal bitte das hier:

Code: Alles auswählen

powerbook:Python Simon$ cat urllib2-2.5.py 
import urllib2

u = urllib2.urlopen('http://www.playlist.com/searchbeta/tracks#Buraka%20Som%20Sistema/1')
powerbook:Python Simon$ cat urllib2-3.0.py 
import urllib.request, urllib.error, urllib.parse

u = urllib.request.urlopen('http://www.playlist.com/searchbeta/tracks#Buraka%20Som%20Sistema/1')
powerbook:Python Simon$ python2.5 urllib2-2.5.py 
Traceback (most recent call last):
  File "urllib2-2.5.py", line 3, in <module>
    u = urllib2.urlopen('http://www.playlist.com/searchbeta/tracks#Buraka%20Som%20Sistema/1')
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/urllib2.py", line 121, in urlopen
    return _opener.open(url, data)
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/urllib2.py", line 380, in open
    response = meth(req, response)
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/urllib2.py", line 491, in http_response
    'http', request, response, code, msg, hdrs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/urllib2.py", line 418, in error
    return self._call_chain(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/urllib2.py", line 353, in _call_chain
    result = func(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/urllib2.py", line 499, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found
powerbook:Python Simon$ python3.0 urllib2-3.0.py 
Traceback (most recent call last):
  File "urllib2-3.0.py", line 3, in <module>
    u = urllib.request.urlopen('http://www.playlist.com/searchbeta/tracks#Buraka%20Som%20Sistema/1')
  File "/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/urllib/request.py", line 122, in urlopen
    return _opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/urllib/request.py", line 364, in open
    response = meth(req, response)
  File "/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/urllib/request.py", line 476, in http_response
    'http', request, response, code, msg, hdrs)
  File "/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/urllib/request.py", line 402, in error
    return self._call_chain(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/urllib/request.py", line 336, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/urllib/request.py", line 484, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Ne, Leerzeichen bringen auch nichts. Die Seite, die dann zurückgegeben wird, ist die hier:

Code: Alles auswählen

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/0.6.35</center>
</body>
</html>
Und das hat nichts mit der Seite zu tun, die eigentlich angefordert werden sollte. Ich ersetze in all meinen Urls die Leerzeichen durch '%20' und das funktioniert auch immer. Nur hier nicht !?

Gruss, Seven
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Darf ich dich fragen, wieso du diese Seite auslesen möchtest? Die Daten werden schliesslich bringt? Die Daten werden eh ehrst nach dem Seitenaufbau mittels AJAX nachgeladen.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

DatenMetzgerX hat geschrieben:Darf ich dich fragen, wieso du diese Seite auslesen möchtest? Die Daten werden schliesslich bringt? Die Daten werden eh ehrst nach dem Seitenaufbau mittels AJAX nachgeladen.
In der Tat interessieren mich die Daten hinter diesem Link nicht mehr. Aber das Phänomen, warum sich diese URL mit urllib2 nicht laden läßt, weckt immer noch mein Interesse. Reiner Forschergeist sozusagen.

Mich interessieren dagegen auf playlist.com die Userplaylisten, die will ich importieren.

Mit dieser Verlinkung bekomme ich das auch hin:
http://pl.playlist.com/pl.php?e=1&playlist=2884853003

Die IDs hole ich mir hier:
http://www.playlist.com/playlist

Die ursprüngliche Idee, die Bands direkt über playlist.com zu suchen, habe ich aufgegeben. SeeqPod stellt eine API zur Verfügung und damit geht das sehr bequem.

Gruss, Seven
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

snakeseven hat geschrieben:In der Tat interessieren mich die Daten hinter diesem Link nicht mehr. Aber das Phänomen, warum sich diese URL mit urllib2 nicht laden läßt, weckt immer noch mein Interesse. Reiner Forschergeist sozusagen.
Ich tippe darauf, dass die Betreiber mutwillig ein HTTP 404 erzeugen, wenn sie anhand der HTTP-Header meinen, es nicht mit einem Browser zu tun zu haben. Nutze ich "curl", kommt auch ein 404 zurück.

Stefan
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Lustigerweise hat es bei mir mit ``wget`` durchaus funktioniert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

sma hat geschrieben:Ich tippe darauf, dass die Betreiber mutwillig ein HTTP 404 erzeugen, wenn sie anhand der HTTP-Header meinen, es nicht mit einem Browser zu tun zu haben. Nutze ich "curl", kommt auch ein 404 zurück.
Stefan
Ja, das dacht ich auch und hatte das ganze dann mit gültigem Browser Header geschickt:

Code: Alles auswählen

useragents = [
                "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)",
                "Mozilla/2.0 (compatible; MSIE 3.0B; Windows NT)",
                "Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)",
                "Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)",
                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
                "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)",
                "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1",
                "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0"
            ]
            
txheader = {    
            'User-Agent': useragents[randint(0,len(useragents)-1)], 
            'Accept-Language': 'en', 
            'Accept-Encoding': 'utf-8',                                        
        } 
        
req = urllib2.Request(url, None, txheader)
u = urllib2.urlopen(req)
Hat aber nichts genützt.

Gruss, Seven
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Hatte ich bei curl auch probiert, brachte aber nix. Hatte dann keine Lust, herauszufinden, was genau curl da schickt, wie es sich von einem Browser unterscheidet und ob das ganze wirklich daran liegt. Leonidas, funktioniert bei dir nur wget, oder auch curl?

Stefan
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Naja, da gibt es ja noch ein paar Sachen mehr, die ein Browser so mitschickt...

Schon mal einen Referer mit gesendet?

Edit: Am Referer liegt es wohl nicht. Das geht nämlich (Firebug):
Host
pl.playlist.com

User-Agent
Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 (.NET CLR 3.5
.30729)

Accept
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language
de,chrome://global/locale/intl.properties;q=0.5

Accept-Encoding
gzip,deflate

Accept-Charset
ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive
300

Connection
keep-alive

Referer
http://www.python-forum.de/viewtopic.php?p=131412

Cache-Control
max-age=0

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sma hat geschrieben:Leonidas, funktioniert bei dir nur wget, oder auch curl?
Nur ``wget``, habe das gerade mit ``curl`` ausprobiert (musste das eben installieren) und da kriege ich, genauso wie du, einen 404-Fehler.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

btw. über einen squid proxy geht's ;)

EDIT: Sorry, hatte mit der url http://pl.playlist.com/pl.php?e=1&playlist=2884853003 getestet und nicht mit der original...

Aber egal. Denn die Original Adresse bring ja eh nix, was die Playlist ja per AJAX nachgeladen wird.
Also bei der Adresse http://www.playlist.com/searchbeta/trac ... 0Sistema/1 wird die Playlist per AJAX anscheinend damit geholt: http://www.playlist.com/async/searchbet ... istema%2F1

EDIT2: Ach zum 404 Fehler: Es liegt am Anker Zusatz "#Buraka Som Sistema/1", wenn man den weg läßt geht's... Ein Browser schickt den ja IMHO auch nicht mir.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

jens hat geschrieben:EDIT2: Ach zum 404 Fehler: Es liegt am Anker Zusatz "#Buraka Som Sistema/1", wenn man den weg läßt geht's... Ein Browser schickt den ja IMHO auch nicht mir.
Ja natürlich!

Stefan
Zuletzt geändert von sma am Sonntag 5. April 2009, 13:50, insgesamt 1-mal geändert.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hat sich wahrscheinlich überschnitten: Wie ich schon geschrieben hat, es wird am Anker in der url liegen ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

jens hat geschrieben:Hat sich wahrscheinlich überschnitten: Wie ich schon geschrieben hat, es wird am Anker in der url liegen ;)
Ja, tatsächlich, ohne Anker gehts:

Code: Alles auswählen

http://www.playlist.com/searchbeta/tracks/Buraka%20Som%20Sistema/2

Grüße, Seven
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

@snakeseven: du hättest in deinem Test auch random.choice nehmen können ;)
Antworten