2011-12-07 11 views
5

Ho scrivere questa funzione:come verificare se urllib2 segue un reindirizzamento?

def download_mp3(url,name): 
     opener1 = urllib2.build_opener() 
     page1 = opener1.open(url) 
     mp3 = page1.read() 
     filename = name+'.mp3' 
     fout = open(filename, 'wb') 
     fout.write(mp3) 
     fout.close() 

Questa funzione prende un URL e un nome sia come stringa. Quindi scaricherà e salverà un mp3 dall'URL con il nome del nome della variabile.

l'url è in forma http://site/download.php?id=xxxx dove xxxx è l'id di un mp3

se questo ID non esiste il sito mi reindirizza a un'altra pagina.

Quindi, la domanda è: come posso verificare se questo ID esiste? Ho cercato di verificare se l'URL esiste con una funzione come questa:

def checkUrl(url): 
    p = urlparse(url) 
    conn = httplib.HTTPConnection(p.netloc) 
    conn.request('HEAD', p.path) 
    resp = conn.getresponse() 
    return resp.status < 400 

Ma non sembra lavorare ..

Grazie

risposta

5

Qualcosa di simile, e verificare il codice:

import urllib2, urllib 

class NoRedirectHandler(urllib2.HTTPRedirectHandler): 
    def http_error_302(self, req, fp, code, msg, headers): 
     infourl = urllib.addinfourl(fp, headers, req.get_full_url()) 
     infourl.status = code 
     infourl.code = code 
     return infourl 
    http_error_300 = http_error_302 
    http_error_301 = http_error_302 
    http_error_303 = http_error_302 
    http_error_307 = http_error_302 

opener = urllib2.build_opener(NoRedirectHandler()) 
urllib2.install_opener(opener) 
response = urllib2.urlopen('http://google.com') 
if response.code in (300, 301, 302, 303, 307): 
    print('redirect') 
1

la mia risposta a questo sembrava

req = urllib2.Request(url) 
try: 
    response = urllib2.urlopen(url) 
except urllib2.HTTPError as e: 
    # Do something about it 
    raise HoustonWeHaveAProblem 
else: 
    if response.url != url: 
     print 'We have redirected!' 
+1

Non sarebbe ** se response.geturl()! = Url: **? – alfadog67

Problemi correlati