Categories: Python

【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」、小さい場合は「
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

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago