Pythonのrequestsを利用してファイルダウンロードする方法

More than 1 year has passed since last update.


1. はじめに

PythonのHTTPクライアントライブラリであるrequestsを利用して、普通のファイルダウンロードを行う方法について説明したいと思います。Rest API(json形式)によるファイルダウンロードについては次回説明する予定です。

なお、アップロードについては「Pythonのrequestsを利用してmultipart/form-dataのFormにファイルアップロードする方法」を参照ください。


2. ソースコード


fileDownloadDemo.py

# -*- coding: utf-8 -*-

import requests
import os
from datetime import datetime

# ★ポイント1
# ex) set DOWNLOAD_SAVE_DIR=C:/Temp/flaskDownloadSaveDir
DOWNLOAD_SAVE_DIR = os.getenv("DOWNLOAD_SAVE_DIR")

# main
if __name__ == "__main__":

# ★ポイント2
url = 'http://localhost:3000/report3/0000001'
response = requests.get(url)

# ★ポイント3
contentType = response.headers['Content-Type']
contentDisposition = response.headers['Content-Disposition']
ATTRIBUTE = 'filename='
fileName = contentDisposition[contentDisposition.find(ATTRIBUTE) + len(ATTRIBUTE):]

# ★ポイント4
saveFileName = datetime.now().strftime("%Y%m%d_%H%M%S_") + fileName
saveFilePath = os.path.join(DOWNLOAD_SAVE_DIR, saveFileName)
with open(saveFilePath, 'wb') as saveFile:
saveFile.write(response.content)


★ポイント1

サンプルではダウンロードしたファイルを保存するディレクトリを環境変数から取得できるようにしました。

★ポイント2

requestsget()でファイルダウンロードのURLにアクセスします。特別なことはありません。なお、サンプルではHTTPのGETメソッドでアクセスするAPIにしています。

★ポイント3

requestsheadersを利用してHTTPレスポンスヘッダからContentTypeや添付ファイルのファイル名を取得します。

なお、サンプルのAPIは「Flaskでファイルダウンロードを実現する3つの方法」で紹介している内容を前提としています。

(注意)

サンプルのファイルダウンロードAPIではContent-Dispositionヘッダで添付ファイル名を指定する仕様としています。

Content-Dispositionヘッダは必須ではないので、APIによっては付与されていない場合もあるので注意してください。付与されていない場合はContentTypeから拡張子を類推してファイル名を決める必要があります。

★ポイント4

requestsのHTTPレスポンスのcontentを利用してダウンロードファイルのデータにアクセスし、バイナリデータをファイルとして保存します。普通のファイル保存の処理です。

サンプルでは★ポイント1で取得したディレクトリに、年月日時分秒のプレフィックスを付与して保存しています。


3. さいごに

今回はrequestsを利用して普通のファイルダウンロードを行う方法について説明しました。

次回はrequestsRest API(json形式)によるファイルダウンロードを行う方法について説明する予定です。