2009-11-17 3 views
6

Je remarque que parfois les fichiers audio sur Internet ont une "fausse" URL.Comment obtenir la véritable URL d'un fichier sur le web. (Python)

http://garagaeband.com/3252243 

et cela à l'URL réelle:

http://garageband.com/michael_jackson4.mp3 

Ma question est ... quand fourni avec l'URL faux, comment pouvez-vous obtenir l'URL REAL des en-têtes?

Actuellement, ceci est mon code pour lire les en-têtes d'un fichier. Je ne sais pas si ce code va m'apporter ce que je veux accomplir. Comment est-ce que j'analyse le "vrai" URL des en-têtes de réponse?

import httplib 
conn = httplib.HTTPConnection(head) 
conn.request("HEAD",tail) 
res = conn.getresponse() 

Cela a une redirection 302: http://www.garageband.com/mp3cat/.UZCMYiqF7Kum/01_No_pierdas_la_fuente_del_gozo.mp3

Répondre

8

Utilisez urllib.getUrl()

modifier: Désolé, je n'ai pas fait cela depuis un moment:

import urllib 
urllib.urlopen(url).geturl() 

Par exemple:

>>> f = urllib2.urlopen("http://tinyurl.com/oex2e") 
>>> f.geturl() 
'http://www.amazon.com/All-Creatures-Great-Small-Collection/dp/B00006G8FI' 
>>> 
0

Vous devez lire la réponse, se rendre compte que vous avez un 302 (TROUVE), et analyser le véritable URL de l'en-tête de réponse , puis récupérez la ressource en utilisant le nouvel URI.

+0

Comment est-ce que j'analyse les en-têtes réels de réponse de forme d'URL? – TIMEX

+0

urllib et urllib2 de Python suivent les redirections pour vous, et gardent la trace de la nouvelle URL, comme Chris Lacasse l'indique dans sa solution. –

+0

Cependant, je ne peux pas sembler le tester car je connais un serveur à tester et je n'ai pas envie d'en créer un moi-même. ;) –

2

Mark Pilgrim conseille d'utiliser httplib2 dans "Dive Into Python3" car il gère beaucoup de choses (y compris les redirections) d'une manière plus intelligente.

>>> import httplib2 
>>> h = httplib2.Http() 
>>> response, content = h.request("http://garagaeband.com/3252243") 
>>> response["content-location"] 
    "http://garageband.com/michael_jackson4.mp3" 
+1

Bien qu'il semble que vous l'ayez fait de manière interactive, vous avez simplement écrit le résultat attendu. Sinon, vous n'auriez pas listé "http" deux fois dans votre URL de requête et vous auriez vu que "garagaeband.com" (qui était dans la description de l'OP) n'existe pas réellement et déclenche une erreur "Aucune adresse associée à nodename". –

+0

J'ai utilisé une session interactive, et j'ai remplacé l'url par les URLs de l'affiche :) merci pour le pointeur. Je vais corriger la répétition "http: //"^_^ – tosh

+0

"curl http://garagaeband.com/3252243" - "curl: (6) Impossible de résoudre l'hôte 'garagaeband.com'". Comment la session interactive peut-elle fonctionner lorsque le nom de domaine de votre requête n'existe pas? –

0

J'ai résolu la réponse.

import urllib2 
    req = urllib2.Request('http://' + theurl) 
    opener = urllib2.build_opener() 
    f = opener.open(req) 
    print 'the real url is......' + f .url 
+0

Il n'y a pas besoin de toutes ces étapes. Faites simplement "urllib2.urlopen ('http ....'). geturl()" comme étant le plus simple Si vous voulez un objet Request, alors "urllib2.urlopen (req) "fonctionne également. –

Questions connexes