Seite 1 von 1

Browser öffnet url, urllib2 nicht !?

Verfasst: Samstag 4. April 2009, 09:42
von snakeseven
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

Verfasst: Samstag 4. April 2009, 10:41
von 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!?

Verfasst: Samstag 4. April 2009, 12:38
von sma
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

Verfasst: Samstag 4. April 2009, 16:07
von derdon
@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

Verfasst: Samstag 4. April 2009, 16:21
von snakeseven
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

Verfasst: Samstag 4. April 2009, 16:22
von DatenMetzgerX
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.

Verfasst: Samstag 4. April 2009, 19:17
von snakeseven
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

Verfasst: Sonntag 5. April 2009, 09:03
von sma
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

Verfasst: Sonntag 5. April 2009, 12:14
von Leonidas
Lustigerweise hat es bei mir mit ``wget`` durchaus funktioniert.

Verfasst: Sonntag 5. April 2009, 12:55
von snakeseven
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

Verfasst: Sonntag 5. April 2009, 13:20
von sma
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

Verfasst: Sonntag 5. April 2009, 13:21
von jens
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

Verfasst: Sonntag 5. April 2009, 13:28
von Leonidas
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.

Verfasst: Sonntag 5. April 2009, 13:34
von jens
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.

Verfasst: Sonntag 5. April 2009, 13:47
von sma
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

Verfasst: Sonntag 5. April 2009, 13:48
von jens
Hat sich wahrscheinlich überschnitten: Wie ich schon geschrieben hat, es wird am Anker in der url liegen ;)

Verfasst: Sonntag 5. April 2009, 15:41
von snakeseven
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

Verfasst: Sonntag 5. April 2009, 15:50
von derdon
@snakeseven: du hättest in deinem Test auch random.choice nehmen können ;)