PythonでHTTP経由でファイルをダウンロードする方法

Pythonでは、HTTPを通じて簡単にファイルをダウンロードするための方法がいくつかあります。代表的な方法は、標準ライブラリのurllibモジュールと、外部ライブラリのrequestsを使ったアプローチです。

urllibを使用したファイルダウンロード

Pythonの標準ライブラリであるurllibを使うと、非常にシンプルにファイルをダウンロードできます。以下の例では、urllib.request.urlretrieve()を使用して、指定したURLからファイルを保存しています。

import urllib.request
urllib.request.urlretrieve('http://example.com/file.zip', 'file.zip')

このメソッドは直接ファイルをダウンロードして保存するため、非常に簡単です。ただし、urlretrieveは「レガシーインターフェース」として将来的に非推奨になる可能性があります。

requestsを使用したファイルダウンロード

もう一つの方法として、外部ライブラリrequestsを使う方法があります。requestsは、より直感的なAPIを提供しており、特に認証や複雑なリクエスト処理が必要な場合に有用です。ファイルをダウンロードする基本的な例は以下の通りです。

import requests
url = 'http://example.com/file.zip'
response = requests.get(url)
with open('file.zip', 'wb') as f:
    f.write(response.content)

この方法では、HTTPレスポンス全体をメモリに保持し、その後ファイルに書き込むため、大きなファイルをダウンロードする際には注意が必要です。

大きなファイルのダウンロード - ストリーミング

大きなファイルをダウンロードする際は、requests.get()stream=Trueオプションを使用して、ファイルをチャンクごとにダウンロードしながら保存することでメモリ使用量を抑えることができます。

import requests
url = 'http://example.com/largefile.zip'
response = requests.get(url, stream=True)
with open('largefile.zip', 'wb') as f:
    for chunk in response.iter_content(chunk_size=1024):
        if chunk:
            f.write(chunk)

この方法では、ファイルのチャンクサイズ(ここでは1024バイト)に分割して読み込むことで、メモリ効率が向上します。

まとめ

PythonでHTTP経由のファイルダウンロードは、urllibrequestsを使用して簡単に実装できます。特に、requestsは直感的で扱いやすいライブラリとして人気があり、ファイルのサイズに応じてストリーミング機能を活用することで、大きなファイルも効率的にダウンロードできます。