Python、Requestsを使ったダウンロード

Python Requests shutil

概要

requestsを使い、Pythonプログラム上からWeb上のファイルをダウンロードするサンプルを紹介していきます。

reqiestsのインストール

まだインストールしていない場合は、pipでインストールしておきましょう。

pip install requests

方法1

標準ライブラリshutilcopyfileobjを使う例です。何バイトずつ書き込む...みたいな処理もshutilの内部で行ってくれるので、こちらの気にする部分が少なく簡単です。

import os
import shutil
import requests


def download(url):
    file_name = os.path.basename(url)
    res = requests.get(url, stream=True)
    if res.status_code == 200:
        with open(file_name, 'wb') as file:
            res.raw.decode_content = True
            shutil.copyfileobj(res.raw, file)


if __name__ == '__main__':
    url = 'https://narito.ninja/media/316/result.png'
    download(url)

チャンクのサイズを変えたい場合は、オブション引数のlengthを使います。

shutil.copyfileobj(res.raw, file, length=1024)

方法2

requestsの、Response.iter_contentを使い、データを数回に分けて書き込んでいきます。 こちらもメモリがパンクすることはないでしょう。

import os
import requests


def download(url):
    file_name = os.path.basename(url)
    res = requests.get(url, stream=True)
    if res.status_code == 200:
        with open(file_name, 'wb') as file:
            for chunk in res.iter_content(chunk_size=1024):
                file.write(chunk)


if __name__ == '__main__':
    url = 'https://narito.ninja/media/316/result.png'
    download(url)

ダウンロードの場合は、stream=Trueとしましょう。こうすることで、大きいファイルが一気に読み込まれることがなくなります

res = requests.get(url, stream=True)

リクエストが成功した場合です。

if res.status_code == 200:

次の部分はファイル名を取得する処理です。https://narito.ninja/image.pngならfile_nameにはimage.pngが入り、http://narito.ninja/bgm.mp3ならfile_nameにはbgm.mp3が入ります。

file_name = os.path.basename(url)

これは1024バイトにわけて書き込んでいます。

for chunk in res.iter_content(chunk_size=1024):
    file.write(chunk)

ちなみにですが、iter_contentを使わずfor chunk in res:とした場合、128バイトずつになります。これは__iter__()return self.iter_content(128)としているためです。なので、無理にiter_contentを無理に使う必要はなかったりします。

for chunk in res:
    file.write(chunk)

Relation Posts

関連記事はありません。

Comment

記事にコメントする

まだコメントはありません。