Python PR

【Python】Icrawlerを使って画像を大量にダウンロードする

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

この記事では、Icrawlerを使って画像を大量にダウンロードする方法を解説します。

Icrawlerは、検索エンジンや Flickr から画像を一括でダウンロードできる外部ライブラリです。例えば、機械学習のトレーニング用の画像が集めたい時などに使えます。

それでは、Icrawlerの使い方を見てきましょう!

注意
  • Python 3.5以降 推奨

インストール

Icrawlerは、pipでインストールできます。

pip install icrawler

使ってみる

まずは簡単なコードを見てみましょう!

from icrawler.builtin import GoogleImageCrawler

# 検索エンジンクローラーの生成(今回はグーグル)
google_crawler = GoogleImageCrawler(storage={'root_dir': 'images'})

# クロール開始
google_crawler.crawl(keyword='犬', max_num=5)

上記コードを実行すると犬の写真が指定したディレクトリに5枚ダウンロードされます。

このように簡単に任意のキーワードの画像を収集することができます。

クローラー

Icrawlerを使用するにはクローラーを使います。先程の「使ってみる」では、Googleクローラーを生成していました。

from icrawler.builtin import GoogleImageCrawler

google_crawler = GoogleImageCrawler(storage={'root_dir': 'images'})

Icrawlerには以下のようなクローラーが用意されています。

  • Google
  • Bing
  • Baidu
  • Flickr
  • Webサイトからすべての画像をクロールするクローラー
  • URLリストから画像をダウンロードするクローラー

この記事ではGoogleクローラーをメインに解説していきます。他のクローラーを使いたい方は以下のサイトを参考にしてください。

LinkBuilt-in crawlers — icrawler 0.6.6 documentation

スレッド数の変更

feeder_threads引数でフィーダー、parser_threads引数でパーサー、downloader_threads引数でダウンローダーのスレッド数を変更することができます。

GoogleImageCrawler(
    feeder_threads=2, 
    parser_threads=2, 
    downloader_threads=4
)

保存場所の変更

クローラーのstorage引数を指定することでダウンロードした画像を保存する場所を変更できます。storage引数は辞書なのでkeyvalueを指定する必要があります。

keyには'root_dir'を指定し、valueには保存場所を文字列で指定します。

# 保存するディレクトリ名
dirname = '保存場所'

crawler = GoogleImageCrawler(storage={'root_dir': dirname})

クロール

クローラーからcrawl()メソッドを実行することでクロールを開始することができます。このメソッドは、フィーダー、パーサー、ダウンロードを開始し、すべてのスレッドが終了するまで待ちます。

def crawl(
    keyword: Any,
    filters: Any | None = None,
    offset: int = 0,
    max_num: int = 1000,
    min_size: Any | None = None,
    max_size: Any | None = None,
    language: Any | None = None,
    file_idx_offset: int = 0,
    overwrite: bool = False
) -> None

以下のような引数が定義されています。

keyword ダウンロードする画像のキーワード。
filters ダウンロードする画像の条件。後述。
offset 開始インデックスを示す整数。
max_num クロールする画像の最大数を表す整数。
min_size 最小サイズ。タプルで指定(480, 300)とか。
max_size 最大サイズ。タプルで指定(1280, 720)とか。
language GoogleImageCrawlerを使用する場合に言語を指定できる。
file_idx_offset 整数を設定するとファイル名はfile_idx_offset + 1から始まる。
overwrite 同名ファイルが存在する場合に上書きするかどうか。

例えば、以下のような感じで指定できます。

# 猫の画像を探す
keyward = '猫'
# クロール数
max_num = 10
# 最小サイズ
min_size = (160, 90)
# 最大サイズ
max_size = (1280, 720)
# 言語
language = 'jp'
# ファイル名のオフセット
file_idx_offset = 10
# 上書きするかどうか
overwrite = True

# クロール開始
google_crawler.crawl(
    keyword=keyward, max_num=max_num, min_size=min_size, 
    max_size=max_size, language=language, 
    file_idx_offset=file_idx_offset, overwrite=overwrite)

フィルターの設定

フィルターを設定することでタイプや色、サイズや日付によってクロールしたデータをダウンロードするか決定することができます。

フィルターは検索エンジンごとに使えるオプションが異なります。ここではGoogleクローラーをメインに解説していきます。他のクローラーを使う場合は以下のサイトを参考にしてください。

LinkSearch engine crawlers - Built-in crawlers — icrawler 0.6.6 documentation

フィルターは辞書で指定します。以下のような key と value が設定できます。

type photo、face、clipart、linedrawing、animated
color color、blackandwhite、transparent、red、orange、yellow、green、teal、blue、purple、pink、white、gray、black、brown
size large、medium、icon または 指定されたサイズより大きい場合は「>640x480」、同じ場合は「=640x480」、小さい場合は「<640x480」
license noncommercial、commercial、noncommercial,modify、commercial,modify
date pastday、pastweek または タプルで指定します ((2022, 1, 1), (2023, 1, 1))

例えば以下のコードでは、色が黒っぽく、サイズが640x480より大きく、2022,1,1 ~ 2023,1,1 の間の画像をダウンロードします。

# 猫の画像を探す
keyward = '猫'
# クロール数
max_num = 10

# フィルター
filters = dict(
    color='black',
    size='>640x480',
    date=((2022, 1, 1), (2023, 1, 1))
)

# クロール開始
google_crawler.crawl(keyword=keyward, max_num=max_num, filters=filters)

まとめ

この記事では、Icrawlerを使って画像をダウンロードする方法を解説しました。

画像を一枚一枚ダウンロードするとめちゃくちゃめんどくさいのでIcrawlerを使って一括でダウンロードしちゃいましょう!

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

参考Welcome to icrawler — icrawler 0.6.6 documentation