ファイルをダウンロードしてローカルに保存するスクリプトを書いてみる。ただ保存するだけではつまらないので進捗状況を表示してみよう。
ファイルのダウンロードには urllib モジュールの uriretrieve
関数を使う。
11.4 urllib — URL による任意のリソースへのアクセス
http://www.python.jp/doc/2.4/lib/module-urllib.html
urlretrieve
関数
次の 4 つの引数が指定できる。url
以外の指定は全て任意だ。
url
- ダウンロード対象の URL
filename
(任意)- 保存するファイル名。指定しなかった場合はテンポラリフォルダに適当な名前で保存される。
reporthook
(任意)- ブロックが読み出される度に呼び出される関数。
data
(任意)- POST リクエストするときに使う。指定しなければ自動的に GET リクエストになる。
reporthook
引数に指定した関数には次の 3 つの引数が与えられる。
- これまで転送されたブロック数のカウント
- バイト単位で表されたブロックサイズ
- ファイルの総サイズ
スクリプトの例 download_test.py
#!/usr/bin/python # coding=utf-8 import urllib import urlparse import sys # コマンドライン引数から URL を得る url = sys.argv[ 1 ] # URL からファイル名を得る filename = urlparse.urlparse( url )[ 2 ].split( "/" )[ -1 ] def progress( block_count, block_size, total_size ): ''' コールバック関数 ''' percentage = 100.0 * block_count * block_size / total_size # 改行したくないので print 文は使わない sys.stdout.write( "%.2f %% ( %d KB )\r" % ( percentage, total_size / 1024 ) ) # ダウンロード開始 urllib.urlretrieve( url = url ,filename = filename ,reporthook = progress ) print
実行例
$ python download_test.py "http://www.exmple.com/archive.zip" 12.34 % ( 567 KB )
これだけ。簡単なもんだね。