2010-10-26 15 views
26

Pregunta de dos partes. Estoy intentando descargar múltiples podcasts archivados de Cory Doctorow del archivo de Internet. Los viejos que no entran en mi feed iTunes. He escrito el guión, pero los archivos descargados no están formateados correctamente.¿Cómo descargo un archivo zip en python usando urllib2?

Q1 - ¿Qué cambio para descargar los archivos mp3 zip? P2: ¿Cuál es una mejor forma de pasar las variables a la URL?

# and the base url. 

def dlfile(file_name,file_mode,base_url): 
    from urllib2 import Request, urlopen, URLError, HTTPError 

    #create the url and the request 
    url = base_url + file_name + mid_url + file_name + end_url 
    req = Request(url) 

    # Open the url 
    try: 
     f = urlopen(req) 
     print "downloading " + url 

     # Open our local file for writing 
     local_file = open(file_name, "wb" + file_mode) 
     #Write to our local file 
     local_file.write(f.read()) 
     local_file.close() 

    #handle errors 
    except HTTPError, e: 
     print "HTTP Error:",e.code , url 
    except URLError, e: 
     print "URL Error:",e.reason , url 

# Set the range 
var_range = range(150,153) 

# Iterate over image ranges 
for index in var_range: 

    base_url = 'http://www.archive.org/download/Cory_Doctorow_Podcast_' 
    mid_url = '/Cory_Doctorow_Podcast_' 
    end_url = '_64kb_mp3.zip' 
    #create file name based on known pattern 
    file_name = str(index) 
    dlfile(file_name,"wb",base_url 

Este guión fue adaptado de here

Respuesta

47

Así es como me encargaría de la creación y descarga de la url. Me aseguro de nombrar el archivo como el nombre base de la url (el último bit después de la barra al final) y también estoy usando la cláusula with para abrir el archivo para escribir. Esto usa un ContextManager que es bueno porque cerrará ese archivo cuando el bloque salga. Además, uso una plantilla para construir la cadena para la url. urlopen no necesita un objeto de solicitud, solo una cadena.

import os 
from urllib2 import urlopen, URLError, HTTPError 


def dlfile(url): 
    # Open the url 
    try: 
     f = urlopen(url) 
     print "downloading " + url 

     # Open our local file for writing 
     with open(os.path.basename(url), "wb") as local_file: 
      local_file.write(f.read()) 

    #handle errors 
    except HTTPError, e: 
     print "HTTP Error:", e.code, url 
    except URLError, e: 
     print "URL Error:", e.reason, url 


def main(): 
    # Iterate over image ranges 
    for index in range(150, 151): 
     url = ("http://www.archive.org/download/" 
       "Cory_Doctorow_Podcast_%d/" 
       "Cory_Doctorow_Podcast_%d_64kb_mp3.zip" % 
       (index, index)) 
     dlfile(url) 

if __name__ == '__main__': 
    main() 
+0

Trabajó como un campeón. ¡Gracias! – Justjoe

+0

Solo una última pregunta, ¿dónde puedo obtener más información sobre el "% d" utilizado en la URL, todavía estoy un poco incompleto sobre cómo está funcionando? – Justjoe

+0

Consulte los documentos para el formato de cadenas: http://docs.python.org/library/stdtypes.html#string-formatting – dcolish

Cuestiones relacionadas