LoginSignup
2
3

More than 3 years have passed since last update.

【Python】Web上の画像やPDFをストレージにダウンロードせずに関数に渡す方法

Posted at

はじめに

Web上に公開された画像やPDFを利用したいシーンは多いですが、いちいちダウンロードして保存先のパスを参照してませんか?
ここではわざわざ保存せずにURLから直接データを取得して利用する方法を紹介します。

方法

結論から言います。

BytesIOを使いましょう。

ioは標準ライブラリなのでインストールせずとも使えるはずです。

from io import BytesIO

使用例

使用例ですが、厚生労働省から新型コロナウイルスの陽性者数のPDFでも取得してtabulaで表を抽出してみましょう。
(ちなみにtabulaはPDFから表を抽出してくれる関数などを含むライブラリの名前です。インストールはpip install tabula-pyでできます。)
まずは、データの取得から、
requestsでも標準ライブラリのurllibでも構いませんがrequestsのほうが扱いが楽なのでそちらでいきます。

from requests import get

url = 'https://www.mhlw.go.jp/content/10906000/000699602.pdf'
content = get(url).content

これでcontentにはPDFのデータがバイト列で格納されます。
バイト列をそのまま使用できる関数の場合はBytesIOを使うまでも有りませんが、大抵のファイルを扱う関数はPC上のパスを引数に取りますよね。
BytesIOを使うことで
そのような関数にバイト列を渡すことができます。

from tabula import read_pdf

pdf_data = BytesIO(content)
df = read_pdf(pdf_data, pages='1', multiple_tables=False)[0]
df

結果

image.png

抽出の精度はまずまずですがそれはさておき、正常にデータを渡せていますね。

画像でもやってみますか。

import matplotlib.pyplot as plt

url = 'https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F501281%2F428a2cd3-9005-a88d-85fa-648fe37c9618.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=21e8bcf27cad307545ed42fe9dfeaf31'
img = plt.imread(BytesIO(get(url).content))
plt.imshow(img)
plt.show()

結果

image.png

OK

さいごに

受ける側の関数との相性によっては必ずしも万能ではないかもしれませんが、使用機会は多いと思いますので覚えておくと捗るかも。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3