2010-10-26 13 views
26

Question en deux parties. J'essaie de télécharger plusieurs podcasts Cory Doctorow archivés à partir des archives Internet. L'ancien ne vient pas dans mon flux iTunes. J'ai écrit le script mais les fichiers téléchargés ne sont pas correctement formatés.Comment télécharger un fichier zip en python en utilisant urllib2?

Q1 - Qu'est-ce que je change pour télécharger les fichiers mp3 zip? Q2 - Quelle est la meilleure façon de transmettre les variables en 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 

Ce script a été adapté de here

Répondre

47

Voici comment je traiterais le bâtiment de l'URL et le téléchargement. Je m'assure de nommer le fichier comme nom de base de l'URL (le dernier bit après la barre oblique) et j'utilise également la clause with pour ouvrir le fichier dans lequel écrire. Ceci utilise un ContextManager ce qui est bien parce qu'il fermera ce fichier quand le bloc se terminera. En outre, j'utilise un modèle pour construire la chaîne pour l'URL. urlopen n'a pas besoin d'un objet de requête, juste une chaîne.

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

A travaillé comme un champion. Merci! – Justjoe

+0

Juste une dernière question où puis-je en savoir plus sur le "% d" utilisé dans l'URL, je suis encore un peu sommaire sur comment ça marche. – Justjoe

+0

Découvrez les docs pour la mise en forme de chaîne: http://docs.python.org/library/stdtypes.html#string-formatting – dcolish