web-dev-qa-db-fra.com

Comment télécharger un fichier Zip dans python en utilisant urllib2?

Question en deux parties. J'essaie de télécharger plusieurs podcasts Cory Doctorow archivés à partir des archives Internet. L'ancien qui 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.

Q1 - Que dois-je changer pour télécharger les fichiers mp3 Zip? Q2 - Quelle est la meilleure façon de passer les variables dans l'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 ici

30
Justjoe

Voici comment je gérerais la création et le téléchargement d'URL. Je m'assure de nommer le fichier comme nom de base de l'URL (le dernier bit après la barre oblique de fin) et j'utilise également la clause with pour ouvrir le fichier dans lequel écrire. Cela utilise un ContextManager qui est sympa car il fermera ce fichier lorsque le bloc se terminera. De plus, j'utilise un modèle pour construire la chaîne de 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()
52
dcolish
2
pyfunc