Browser öffnet url, urllib2 nicht !?

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

Samstag 4. April 2009, 09:42

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

Samstag 4. April 2009, 10:41

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

Samstag 4. April 2009, 12:38

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

Samstag 4. April 2009, 16:07

@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: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Samstag 4. April 2009, 16:21

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)

Samstag 4. April 2009, 16:22

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: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Samstag 4. April 2009, 19:17

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

Sonntag 5. April 2009, 09:03

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 5. April 2009, 12:14

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

Sonntag 5. April 2009, 12:55

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

Sonntag 5. April 2009, 13:20

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
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 5. April 2009, 13:21

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 5. April 2009, 13:28

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 Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 5. April 2009, 13:34

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.

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

Sonntag 5. April 2009, 13:47

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.
Antworten