mei_13のPython講座 ロゴ

【解説】画像収集を自動化する魔法のツール:Pythonの「icrawler」入門




🐍 初心者歓迎!月額4,000円で質問し放題のPython講座
(1時間4,000円の伴走型ビデオチャット指導も受付中!)
🚀 講座の詳細を見る 📩 質問・お問い合わせ

画像収集を自動化する魔法のツール:Pythonの「icrawler」入門


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。今日は……あの、プログラミングで少し便利なライブラリを見つけたので、紹介してもいいでしょうか……?


Hirokiのアイコン
【Hiroki】 Yukiさん、こんにちは!もちろんです。何についてのライブラリなんですか?


Yukiのアイコン
【Yuki】 はい。ええと、「icrawler」という名前のライブラリです。Hirokiくんは、機械学習の学習用データや、Webサイトに使うための画像をたくさん集めたいと思ったことはありませんか……?


Hirokiのアイコン
【Hiroki】 あります!でも、一つずつ右クリックで保存していくのはすごく時間がかかるし、大変ですよね。


Yukiのアイコン
【Yuki】 そうですよね。手作業だと効率が悪いですし、何より疲れてしまいます。icrawlerを使うと、GoogleやBingといった検索エンジンから、指定したキーワードの画像を自動で、しかも数行のコードでダウンロードできるんです。今日はその使い方を、一緒に見ていけたらなと思います……。

icrawlerとは何か


Yukiのアイコン
【Yuki】 まず、icrawlerがどんなものかを簡単に説明しますね。icrawlerはPythonで書かれた、非常に強力で柔軟な画像クローリング・フレームワークです。単に画像をダウンロードするだけでなく、検索エンジン(Google, Bing, Baiduなど)や、写真共有サイト(Flickr)から画像を収集するための「クローラー」があらかじめ用意されています。


Hirokiのアイコン
【Hiroki】 クローラーっていうのは、Web上の情報を自動で収集してまわるプログラムのことですよね?


Yukiのアイコン
【Yuki】 はい、その通りです。icrawlerの特徴は、ただ動くだけでなく「スレッド」を使って並列処理を行うので、画像を集めるスピードがとても速いことだと思います……。また、自分自身で新しいクローラーを作るための仕組みも整っているので、拡張性も高いんです。


Hirokiのアイコン
【Hiroki】 へぇ、すごいんだなぁ。初心者でも簡単に扱えるものなんですか?


Yukiのアイコン
【Yuki】 ええ、基本的な使い方だけなら、本当に数行書くだけで大丈夫ですよ。わたしも、最初はこんなに簡単にできるなんて驚きました……。

準備をしましょう:インストール方法


Yukiのアイコン
【Yuki】 では、まずはicrawlerを使えるように準備をしましょうか。Pythonがインストールされている環境であれば、pipというコマンドを使って簡単に導入できます。


Hirokiのアイコン
【Hiroki】 コマンドプロンプトやターミナルで実行すればいいんですね。


Yukiのアイコン
【Yuki】 はい、そうです。以下のコマンドを入力してみてください。

pip install icrawler


Hirokiのアイコン
【Hiroki】 入力しました!……「Successfully installed」と出ました。これで準備完了ですね。


Yukiのアイコン
【Yuki】 はい、無事にインストールできたみたいで良かったです。これで準備は整いました。

実際に動かしてみましょう:Google検索から画像を取得する


Yukiのアイコン
【Yuki】 それでは、実際にGoogleから画像をダウンロードするコードを書いてみましょう。今回は例として「猫」の画像を10枚ほど集めてみることにしますね……。


Hirokiのアイコン
【Hiroki】 猫、いいですね。癒やされます。


Yukiのアイコン
【Yuki】 ふふ、そうですね。では、以下のコードを書いて実行してみましょう。

from icrawler.builtin import GoogleImageCrawler

# 保存先のディレクトリを指定して、クローラーを初期化します
google_crawler = GoogleImageCrawler(storage={'root_dir': 'cats'})

# キーワードを指定して、画像を10枚ダウンロードします
google_crawler.crawl(keyword='猫', max_num=10)


Hirokiのアイコン
【Hiroki】 えっ、これだけですか?


Yukiのアイコン
【Yuki】 はい、これだけで「cats」というフォルダが作られて、その中に10枚の猫の画像が保存されるはずです。


Hirokiのアイコン
【Hiroki】 やってみます……。あ、本当にフォルダができて、画像がどんどん保存されていきます!これなら僕にもできそうです。


Yukiのアイコン
【Yuki】 よかったです。少し補足すると、storage={'root_dir': 'cats'} という部分で保存先のフォルダ名を指定しています。そして crawl メソッドの keyword で検索ワードを、max_num で取得したい最大枚数を指定しているんです。

より詳細な条件で検索する:フィルター機能


Hirokiのアイコン
【Hiroki】 でも、ただ「猫」って検索するだけだと、たまに関係ない画像が混じったり、サイズが小さすぎたりすることもありますよね?


Yukiのアイコン
【Yuki】 そうですね……。そんな時は、「フィルター」機能を使うのがいいかもしれません。画像の色やサイズ、投稿された日付などで絞り込むことができるんです。


Hirokiのアイコン
【Hiroki】 そんなこともできるんですね!


Yukiのアイコン
【Yuki】 はい。例えば、「大きめのサイズ」で「オレンジ色の猫」を「最近1週間以内」に投稿されたものから探す、といった指定が可能です。


Hirokiのアイコン
【Hiroki】 それは便利そうですね。どうやって書くんですか?


Yukiのアイコン
【Yuki】 filters という引数を使います。こんな風に書いてみてください。

from icrawler.builtin import GoogleImageCrawler

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

# フィルター条件を設定します
filters = dict(
    size='large',        # 画像サイズを「大」に指定
    color='orange',      # 主な色を「オレンジ」に指定
    date=((2023, 1, 1), (2024, 1, 1)) # 期間を指定する場合
)

# フィルターを適用して実行します
google_crawler.crawl(keyword='猫', filters=filters, max_num=5)


Hirokiのアイコン
【Hiroki】 なるほど、辞書形式で条件を渡すんですね。


Yukiのアイコン
【Yuki】 はい。ただし、注意が必要なのは、検索エンジンによって指定できるフィルターの種類が少しずつ違うことです……。Googleで使えるものが、Bingでは使えないということもあるので、公式のドキュメントを確認しながら進めるのが確実だと思います。


Hirokiのアイコン
【Hiroki】 検索エンジンごとのクセみたいなものがあるんですね。勉強になります。

Bingや他のサイトから集める方法


Yukiのアイコン
【Yuki】 Google以外にも、Bingなどを使いたい場合もありますよね。その時も、使い方はほとんど同じです。


Hirokiのアイコン
【Hiroki】 クラス名を変えるだけでいいんですか?


Yukiのアイコン
【Yuki】 はい。例えばBingなら BingImageCrawler を使います。

from icrawler.builtin import BingImageCrawler

# Bing版のクローラーです
bing_crawler = BingImageCrawler(storage={'root_dir': 'bing_cats'})
bing_crawler.crawl(keyword='猫', max_num=10)


Hirokiのアイコン
【Hiroki】 本当に使い方が統一されていて、覚えやすいですね。


Yukiのアイコン
【Yuki】 そうなんです。icrawlerの作者の方が、誰でも簡単に扱えるように設計してくださったおかげですね。他にも、Baidu(百度)用の BaiduImageCrawler や、Flickr用の FlickrImageCrawler などが標準で用意されています。

注意点とマナーについて:大切なこと


Yukiのアイコン
【Yuki】 あの、Hirokiくん。一つ、とても大切なことをお話ししてもいいでしょうか……。


Hirokiのアイコン
【Hiroki】 はい、何でしょうか?


Yukiのアイコン
【Yuki】 プログラムで画像を自動収集するのはとても便利ですが、気をつけなければいけない「マナー」と「法律」があります。


Hirokiのアイコン
【Hiroki】 マナーと法律……そういえば、勝手に画像を集めてもいいのかなって少し思っていました。


Yukiのアイコン
【Yuki】 まず一つは、相手のサーバーに負担をかけすぎないことです。短時間に大量のアクセスをすると、相手のWebサイトが動かなくなってしまうかもしれません。


Hirokiのアイコン
【Hiroki】 それは大変だ……。icrawlerはそのあたり、大丈夫なんですか?


Yukiのアイコン
【Yuki】 icrawlerにはスレッド制限などの機能がありますが、デフォルトの設定であまりに多くの画像を一度に集めようとするのは控えたほうがいいですね。また、サイトの利用規約(robots.txtなど)でスクレイピングが禁止されていないかを確認することも大切だと思います……。


Hirokiのアイコン
【Hiroki】 なるほど。道具が便利だからこそ、使う側の責任が大事なんですね。


Yukiのアイコン
【Yuki】 はい。もう一つは、著作権です。集めた画像にはすべて著作権者がいます。自分で見て楽しむ分には「私的使用のための複製」として認められることが多いですが、その画像を勝手にWebサイトに載せたり、販売したりしてはいけません。


Hirokiのアイコン
【Hiroki】 機械学習の学習用データにするのはどうなんですか?


Yukiのアイコン
【Yuki】 現在の日本の著作権法(第30条の4)では、情報解析を目的とした利用は原則として認められていますが……それでも、権利者を不当に害さないよう、慎重に扱う必要があります。


Hirokiのアイコン
【Hiroki】 わかりました。便利なツールだからこそ、ルールを守って正しく使います!

icrawlerの内部構造について(少し詳しく)


Yukiのアイコン
【Yuki】 Hirokiくんが将来もっと複雑なことをしたくなった時のために、icrawlerが裏側でどう動いているのか、少しだけお話ししますね……。


Hirokiのアイコン
【Hiroki】 ぜひ教えてください!


Yukiのアイコン
【Yuki】 icrawlerは、大きく分けて3つの役割を持ったコンポーネントで動いています。

  1. Feeder(フィーダー): 検索結果のページURLなどを生成して、順番に並べる役割です。
  2. Parser(パーサー): ページの中から、画像の直リンクを見つけ出す役割です。
  3. Downloader(ダウンローダー): そのリンクから実際に画像をダウンロードして保存する役割です。


Hirokiのアイコン
【Hiroki】 役割分担ができているんですね。


Yukiのアイコン
【Yuki】 はい。これを「スレッド」という仕組みで同時に並行して動かしているので、とても効率がいいんです。もしHirokiくんが「特定のニュースサイトからだけ画像を集めたい」と思ったら、このParserの部分だけを自分で書き換えることで、オリジナルのクローラーを作ることもできるんですよ。


Hirokiのアイコン
【Hiroki】 へぇ、カスタマイズもできるんだ!プログラミングがもっと上手になったら挑戦してみたいです。


Yukiのアイコン
【Yuki】 その意気です。……あ、でも無理はしないでくださいね。まずは用意されている機能を使うだけでも、十分にいろいろなことができるはずですから。

icrawlerで特定のURLから画像を収集する


Hirokiのアイコン
【Hiroki】 検索エンジンじゃなくて、特定のWebサイトにある画像を丸ごと集めたい時はどうすればいいんですか?


Yukiのアイコン
【Yuki】 その場合は、UrlCrawler というものを使うのがいいかもしれません。例えば、特定のサイトのページ内にある画像を全部取得したい時に便利です。

from icrawler.builtin import UrlCrawler

# 特定のURLを指定して収集します
url_crawler = UrlCrawler(storage={'root_dir': 'site_images'})
url_crawler.crawl(urls=['https://example.com/page1.html', 'https://example.com/page2.html'])


Hirokiのアイコン
【Hiroki】 これもすごくシンプルですね。


Yukiのアイコン
【Yuki】 はい。ただ、これも先ほど言ったように、相手のサイトの迷惑にならないように気をつけてくださいね……。わたしも、自分が作ったサイトの画像が急に大量にダウンロードされたら、少しびっくりしてしまうかもしれません。

まとめと参考文献


Yukiのアイコン
【Yuki】 今日はicrawlerについてお話ししましたが、いかがでしたか……?


Hirokiのアイコン
【Hiroki】 すごく分かりやすかったです!たった数行のPythonコードで、こんなに強力な画像収集ができるなんて驚きました。これからのプロジェクトで活用してみたいと思います。


Yukiのアイコン
【Yuki】 そう言ってもらえると、わたしも嬉しいです。……もしもっと詳しく知りたくなったら、以下のリンクを見てみてください。作者の方が公開している公式のドキュメントです。


Hirokiのアイコン
【Hiroki】 ありがとうございます。英語のサイトみたいだけど、コードを読みながら頑張ってみます。


Yukiのアイコン
【Yuki】 Hirokiくんなら、きっと大丈夫だと思います。もし分からないことがあったら、またいつでも聞いてくださいね。わたしで良ければ、いつでも……お手伝いします。


Hirokiのアイコン
【Hiroki】 はい、Yukiさん!また教えてくださいね。


Yukiのアイコン
【Yuki】 ええ、喜んで。……あ、もうこんな時間ですね。今日はここまでにしましょうか。お疲れ様でした。


Hirokiのアイコン
【Hiroki】 お疲れ様でした!


Yukiのアイコン
【Yuki】 ……ふぅ。……うまく説明できていたでしょうか。少し心配ですけれど、Hirokiくんが喜んでくれたみたいで、良かったです。……さて、わたしも少し、夜の作業に戻ろうと思います……。



< データベース操作
コラム一覧に戻る
PyCaret >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
4,000円/60分伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

📩 質問・お問い合わせはこちら



AIアシスタント Yuki