urllib.request によるファイルのダウンロード
urllib.request.urlretrieve
を使用すると、簡単に Web 上のファイルをダウンロードしてローカルファイルとして保存することができます。
下記の download_file
関数は、指定した URL のファイルをカレントディレクトリにダウンロードします。
import urllib.request
import os.path
def download_file(url):
filename = os.path.basename(url) or 'index.html'
urllib.request.urlretrieve(url, filename)
if __name__ == '__main__':
download_file('https://example.com/')
ローカルに作成されるファイル名は、os.path.basename
を使用して、URL の末尾から切り出しています。
URL の末尾にファイル名らしきものが見つからない場合は、デフォルトファイル名として index.html
で保存するようにしています。
テンポラリファイルとしてダウンロードする
urllib.request.urlretrieve
の 2 番目のパラメータ (filename
) を省略すると、テンポラリディレクトリに適当なファイル名で保存されます。
このファイルパスは、戻り値で返されるタプルの先頭に格納されています。
path, headers = urllib.request.urlretrieve('http://example.com/sample.png')
print(path) #=> c:\users\maku\appdata\local\temp\tmpgujizj
urlretrieve
により作成された一時ファイルを確実に削除するには、下記のように後始末しておきます。
urllib.request.urlcleanup()
このファイルはテンポラリディレクトリに作成されるファイルなので、それほど厳密に削除する必要はないかと思いますが、大量のテンポラリファイルが作られるような場合は実行しておいた方がよいでしょう。
ダウンロード時の HTTP レスポンスヘッダの取得
urllib.request.urlretrieve
により、ファイルをダウンロードした際に、ついでに HTTP レスポンスヘッダを取得したい場合 は、下記のように 戻り値のタプルの 2 番目の要素 から取得できます。
path, headers = urllib.request.urlretrieve('https://www.google.co.jp/images/nav_logo242_hr.png')
for key, val in headers.items():
print('{0} ===> {1}'.format(key, val))