こんにちは、Kosei(@kay_diacc2)です!
Python・Requestsを用いたWebファイルダウンロードについて

Web上のファイルをダウンロードする処理は、上図のようにHTTP通信と同様の流れになります。
①クライアント側がダウンロードしたいファイル(画像、テキスト、pdfファイル等)リンクを指定し、HTTPリクエストを送信すると、②Webサーバー側がファイルコンテンツに対応するHTTPレスポンスを返します。
本記事で紹介するWeb上からファイルをダウンロードする方法の特徴は、上図HTTP通信における処理をPythonプログラムで代替するイメージを持っていただければと思います。
プログラミング手順
プログラミング作業の流れを下記に示します。各手順で活用するPythonメソッドの詳細は、後述のプログラミング手法と合わせて解説します。
プログラミング手順 | 活用メソッド | |
---|---|---|
1 | Web上のファイルデータをダウンロード | Requests.get() |
2 | ハードウェア・ローカル環境保存用にファイルを作成 | open() |
3 | ローカルファイルにWebからダウンロードしたファイルデータを書き込む | iter_content() write() |
事前準備
実際のプログラミングではrequrestsモジュールを用い、Webからファイルをダウンロードします。下記コマンドを入力し、事前にモジュールをインストールしましょう。
pip install requests
Web上のファイルデータをダウンロード
ここからはプログラミング解説になります。HTTP通信に基づきWeb上からファイル情報を取得するには、requests.get()メソッドを用います。Webサイトのデータを取得する際に広く用いられるメソッドです。下記のようにコードを記載しましょう。
#モジュール読込
import requests
url = "ダウンロードしたいファイルリンクを記載"
response = requests.get(url)
ハードウェア・ローカル環境保存用にファイル作成
上記で取得したWeb上のファイルデータをお手元のPC等に保存するには、そのデータを書き込むためのローカルファイルを事前に作成しておく必要があります。下記のようにコードを記載しましょう。
file = open("ファイル名.拡張子","wb")
ローカルファイルの作成では、open関数を用います。open関数とはファイル操作を行うためのメソッドであり、新規ファイルの作成や書き込み、読込、更新操作を実行できます。今回は、open関数に”wb”を渡し、バイナリ書き込みモードで新規をファイル生成しています。
ローカルファイルにWebからダウンロードしたファイルデータを書き込む
ローカルファイルにWeb上から取得したファイルデータを書き込むには、下記のようにコードを実行します。
#iter_content()メソッドでWebファイルのデータを渡す
for chunk in response.iter_content(100000):
#ファイル書込
file.write(chunk)
#ファイルを閉じる
file.close()
Webページのファイルデータを書き込むには、for構文とiter_content()メソッドを用います。まず、ループの繰り返し毎に、iter_content()メソッドでファイルデータのチャンクを返します。
各チャンクに格納する最大バイト数は指定可能です。100キロバイトが適切なサイズであるため、iter_content()の引数には100000を渡しています。各チャンクをローカルファイルに書き込む方法としては、write()メソッドを用います。
プログラミング手法のまとめ
以上でプログラミングの解説は全て終了です!最後に使いやすい関数形式で本日紹介したコード全量を示します。
import requests
import os
url = "ダウンロードしたいファイルリンクを指定"
file_dir = "ファイルの保存先指定"
def download_files(url,file_dir):
#Web上のファイルデータをダウンロード
response = requests.get(url)
#HTTP Responseのエラーチェック
try:
response_status = response.raise_for_status()
except Exception as exc:
print("Error:{}".format(exc))
# HTTP Responseが正常な場合は下記実行
if response_status == None:
#open()関数にwbを渡し、バイナリ書き込みモードで新規ファイル生成
file = open(os.path.join(file_dir,os.path.basename(url)),"wb")
#各チャンクをwrite()関数でローカルファイルに書き込む
for chunk in response.iter_content(100000):
file.write(chunk)
#ファイルを閉じる
file.close()
print("ダウンロード・ファイル保存完了")
「第一引数:ダウンロードしたいWebファイルのリンク」「第二引数:ファイルの保存先(ディレクトリ)」を渡すdownload_files()関数です。下記のように記載し関数を実行してみましょう。
url = "ダウンロードしたいファイルリンクを指定"
file_dir = "ファイルの保存先指定"
download_files(url, file_dir)
最後に

お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら