web-dev-qa-db-ja.com

python urllib2を使用してZipファイルをダウンロードするにはどうすればよいですか?

二部構成の質問。インターネットアーカイブから複数のアーカイブされたCory Doctorowポッドキャストをダウンロードしようとしています。私のiTunesフィードに含まれていない古いもの。スクリプトを書きましたが、ダウンロードしたファイルは適切にフォーマットされていません。

Q1-Zip mp3ファイルをダウンロードするために何を変更しますか? Q2-変数を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

このスクリプトは、 here

30
Justjoe

URLの作成とダウンロードの処理方法は次のとおりです。ファイルの名前をURLのベース名(末尾のスラッシュの後の最後のビット)にして、書き込み先のファイルを開くためにwith句も使用していることを確認しています。これは ContextManager を使用します。これは、ブロックの終了時にそのファイルを閉じるため、ニースです。さらに、テンプレートを使用してURLの文字列を作成します。 urlopenはリクエストオブジェクトを必要とせず、文字列のみを必要とします。

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

SOの古いソリューションは、あなたが望むものに沿って:

2
pyfunc