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