Python

【Python3】画像のURLから画像を一括ダウンロードする方法

記事内に商品プロモーションを含む場合があります

機械学習などで画像などを集めるとき、画像のダウンロードのやり方には色々あります。

今回は画像のURLを収集し、そのURL一覧から画像をダウンロードする場合のダウンロードスクリプトをPythonで作成した際の備忘録です。

※ダウンロードしたい画像のURL一覧を、CSVファイルとして準備しておく必要があります。

画像のURLから画像をダウンロードしたい

やりたいことは以下のようなケースです。

  • ダウンロードしたい画像のURL一覧を取得済み
  • そのURL一覧を元に画像をダウンロードしたい

例えば機械学習などで、犬の画像を大量に取得する必要があるときに、ひとまず犬画像のURLを取得したが、ダウンロードはこれからという状況が当てはまります。

以下のように1行に1つのURLが書いてあるCSVを元に、一括でダウンロードしていきます。

https://4.bp.blogspot.com/-VTNahljO4H8/W3abJRPoivI/AAAAAAABN-4/IDo9tfs_j4wuXeH_M-MLRugdkArapplGwCLcBGAs/s800/dog2_2_surprise.png
https://2.bp.blogspot.com/-SW2SI1vs9Qk/WCqsDMBoKOI/AAAAAAAA_00/x96NcaFuhWMC65_pq1k5AIqsytZPO8kDACLcB/s800/inugoya_dog.png
https://1.bp.blogspot.com/-k2Fv1qBMod0/XwkxbNu09lI/AAAAAAABaAI/o3LbX9iveygEAD3LRUsUMX9QAGvgBi_lQCNcBGAsYHQ/s1600/dog_kaiken.png

 

URLからの画像ダウンロードスクリプト

実際に実装したコードは以下のとおりです。

# coding: utf-8

import urllib.request
import csv
import time

PATH = './downloadpic/main/{}.jpg'
CSV = './downloadpic/main/imgurl.csv'
HEADERS = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"}
START = 0


def download_image(url, title):
    print(url)
    request = urllib.request.Request(url=url, headers=HEADERS)
    with open(title, "wb") as f:
        f.write(urllib.request.urlopen(request).read())


def download():
    with open(CSV, newline='') as csv_file:
        count = START
        for row in csv.reader(csv_file):
            time.sleep(5)
            count += 1
            url = row[0]
            download_image(url, PATH.format(str(count)))


if __name__ == "__main__":
    print('ダウンロード開始')
    download()
    print('ダウンロード終了')

 

このコードを実行すると「imgurl.csv」ファイル内に記載されたURLから画像をダウンロードします。

かなり簡単なコードですが、ポイントは2つあります。

  1. 画像ファイルを作成してから、URLから取得してきた画像データを書き込む
  2. クローリングのマナーを守り、ダウンロードの間隔は5秒おきとした

画像ファイルを作成してから、URLから取得してきた画像データを書き込む

urllib.request.urlretrieve」を使用することで直接ダウンロードすることができますが、残念ながらdeprecatedとなっています。

そのため、若干ややこしい方法になりますが先にファイルを作成してから、画像データを書き込むという方法を取る必要があります。

with open(title, "wb") as f:
    f.write(urllib.request.urlopen(request).read())

クローリングのマナーを守り、ダウンロードの間隔は5秒おきとした

こちらはクローリングをする場合の一般常識ですが、アクセスするサイトに迷惑をかけないように、ダウンロードの間隔をしっかりと開けています。

ネットを見ていると1秒開ければ良いといった話も見かけますが、もっと開けたほうが良いです。

今回は5秒にしましたが、もっと長くしてもいいくらいです。

15秒位が良いかもしれません。

まとめ

Pythonを使用して、画像URLからの画像一括ダウンロードは簡単に実装することができました。

クローリングなど、サイトに連続アクセスするような処理を書く場合には、しっかりと間隔を開けて相手サイトの迷惑にならないように意識することが大切です。

最近読んだ「Pythonによるアルゴリズム入門」という本は、Pythonの実装力向上のための良書でした。

Pythonで簡単なスクリプトなどを書く際にも役に立つのでオススメできる一冊です。