2011-12-07 17 views
5

Tôi đã viết chức năng này:cách kiểm tra xem urllib2 có đi theo chuyển hướng không?

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() 

Chức năng này có một url và một tên cả hai như là chuỗi. Sau đó, sẽ tải xuống và lưu một mp3 từ url với tên của tên biến.

url là ở dạng http://site/download.php?id=xxxx trong đó xxxx là id của một mp3

nếu id này không tồn tại trang web chuyển hướng tôi đến một trang khác.

Vì vậy, câu hỏi là: làm cách nào tôi có thể kiểm tra xem id này có tồn tại không? Tôi đã thử để kiểm tra xem địa chỉ tồn tại với một chức năng như thế này:

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

Nhưng nó dường như không làm việc ..

Cảm ơn bạn

Trả lời

5

Something như thế này, và kiểm tra mã:

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

câu trả lời của tôi để này trông giống như

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

Nó sẽ không được ** nếu response.geturl()! = Url: **? – alfadog67