【Python入門】本田翼の画像をスクレイピング。Pythonでできること: 画像のダウンロード。Progateが終わってから行う演習 | BeautifulSoup | Selenium| Bing



●今回紹介したプログラムはこちら
https://colab.research.google.com/drive/1mJrNciqTBEuZmRy5PJcoW8YNFNhVuWE4?usp=sharing

●本田翼 – Bing images
https://www.bing.com/images/search?q=%E6%9C%AC%E7%94%B0%E7%BF%BC

●公式LINEアカウント
質問・企画リクエストを受け付けています。動画の中のプログラムについての質問もOKです!
https://lin.ee/aqGoTvy

●「Webサービス開発入門」の動画はこちら

●「ゲーム開発入門」の動画はこちら

●「作業効率化」の動画はこちら

●テキストから自動音声を作る方法(直也テックの音声はこれで作成)

●Twitter

●経歴
2014.3 同志社大学理工学部情報システムデザイン学科卒業
2014.4 – 2017.2 ヤフー株式会社 フロントエンドエンジニア、iOSアプリエンジニア
2017.2- 株式会社わたしは クリエイティブ開発

現在は大喜利人工知能を開発する”株式会社わたしは”にてクリエイティブ開発者として勤務。

●個人事務所

About

こんにちは。エンジニアの直也です。
今日は「本田翼さんの画像をBing画像検索からスクレイピングする方法」について解説します。
こちらはBingで本田翼さんの画像を検索した結果です。
ここで表示された画像をGoogle Driveに保存することをやります。
Pythonを使ってプログラムを書いていきます。
今日紹介するプログラムはGoogleコラボレイトリーを使っています
これはPythonをオンラインで実行できる環境です
環境自体も簡単に共有することができます
概要欄にプログラムのURLを掲載しております
ぜひ学習の参考にしてください
最初にスクレイピングについての注意事項を話します
過度にアクセスを行うスクレイピングは
サーバに負担をかけるのでやめましょう
節度を守ったスクレイピングを心がけてください
こちらがGoogleコラボレイトリーの画面です
まず画面上部を非表示にします
Googleコラボレイトリーでは
こちらのセルと呼ばれる場所にプログラムを書きます
実行する場合はセルの左の三角ボタンを押してください
するとセルのないのプログラムだけが実行されます
最初にrequestsとBeautifulSoupという2つのライブラリを読み込みます
requestsはHTTPリクエストに関するプログラムを簡単に書けるライブラリです
ライブラリは便利なプログラムの部品をひとまとめにしたファイルのことです
PythonではHTTPリクエスト周りの処理を
ライブラリなしで書こうとすると処理が煩雑になります
なのでライブラリを使います
今回のプログラムでは主にダウンロード(GETリクエスト)するときに使います。
例えば画像をダウンロードするという処理です
BeautifulSoupはスクレイピングを簡単にできるライブラリです。
今回のプログラムでは主に指定したHTMLタグの情報をピンポイントで取得することに使います
importを使ってライブラリを読み込みます
読み込めました
Bing画像検索をスクレイピングするときに注意点があります
BeautifulSoupだけを使ってHTMLを読み込もうとすると
画像が準備されていない状態のHTMLが読み込まれます
これは画像の読み込みやJavascriptによる描画を待たずに
HTMLを取得してしまっているからです
すべての要素を読み込んでからHTMLを取得するためには
BeautifulSoupだけだとやりづらいです
今回はSeleniumも使います
Seleniumはブラウザの操作を自動化できるツールです
Seleniumは要素を読み終えてからのHTMLを取得することもできます
今回はその機能を使います
こちらがSeleniumを準備するための処理です
コマンドは覚える必要はないです。コピペでOKです。
こちらはWebブラウザをUIなしで扱うための設定です
こちらも覚える必要はないです。コピペでOKです。
ブラウザ操作を自動化する際は実は目に見える画面を用意する必要がありません
UIはあくまで人間のためのものであり、コンピュータはUIなしでも処理が可能だからです
準備に1分くらいかかります
次にBing画像検索のURLを準備します
こちらのページはこのURLで見れます
このURLはqの後に検索ワードが入っていることがわかります
これと同じものを作ります
ちなみに検索ワードのことを「クエリ(query)」と言います
URLの一部にクエリを埋め込むと検索URLを生成することができます
次にSeleniumを使ってすべての要素が読み込まれるまで待つという設定を行います
こちらのコードは覚える必要はないです。コピペでOKです。
BeautifulSoupを使ってHTMLを解析します
まずSelenium経由でHTMLを取得します
そうすることでページ上のすべての画像が読み込まれた状態のHTMLを取得することができます
取得したら文字コードの設定を行います
終わったらBeautifulSoupに結果を渡します
ちゃんとHTMLが読み込まれているか確認します
大量のHTMLが読み込まれたらOKです
やけに少ない場合はうまくいっていない可能性があります
次にHTMLから本田翼の画像が入ったイメージタグを取得します
Chromeのデベロッパーツールを使うとHTMLの構造を解析することができます
本田翼の画像を選択するとimgタグがハイライトされます
本田翼の画像のURLがimgタグに入っていることがわかります
この画像のURLさえ手に入ればあとはダウンロードするだけです
BeautifulSoupを使ってHTMLを解析して特定のタグ情報を取得します
find_all関数を使えば指定したタグに該当する要素をリストで返します
実行してみると大量のタグ情報が入ったリストが返ってきました
試しにURLを開いてみると本田翼の画像であることが確認できます
imgタグのリストを変数に代入します
取得したimgタグの数を出力します
画像情報には今回のスクレイピングの場合、二種類あります
まず普通の画像
これはdata-src属性にurlが入っています。それを抜き出します。
次にBase64
Base64は画像をテキストに変換した形式のことをさします
一般的に画像よりもテキストの方が容量が小さく、素早く読み込める利点があります。
Bing画像検索では先頭の20個の画像がbase64形式のようです
base64なので高速に読み込むことができるんです。
テキストから画像に戻すことができます
それをデコードといいます
デコードの処理は後述のsave_base64_image関数で行います
urlとbase64の情報を取得していきます
まず先ほどのイメージタグ情報のリストをforループで回します
get関数を使えば属性情報を取得できます
src属性を取得します
これでbase64の情報だけ取得できました
しかし普通の画像はNoneになります
なのでNoneの場合はdata-src属性も取得することにします
これで普通の画像のURLも取得できました
画像をダウンロードする関数を追加します
こちらのコードは覚える必要はないです。コピペでOKです。
Base64をデコードして画像に戻す関数も追加します
こちらのコードも覚える必要はないです。コピペでOKです。
最後にGoogle Driveに画像を保存します
まずGoogleコラボレイトリーの左のメニューから
Google Driveをマウントします
マウントすると左のメニューにGoogle Driveのディレクトリが追加されます
次にあらかじめGoogle Driveで作成しておいたフォルダを見つけます
そしてパスをコピーします
念のためディレクトリがない場合は新規作成するコードを追加しておきます
enumerateを使えばリストのindexを取得できます
このindexをそのままファイル名にします
formatを使えば文字列内の指定した場所に変数の内容を入れることができます
os.path.joinを使えば引数に指定した文字列をパスの形に繋げることができます
base64の先頭の部分は接頭辞なので必要がありません
接頭辞以降の文字列が画像情報になります
なので接頭辞を削除します
reをimportすれば正規表現を使うことができます
findall関数を使って指定した文字列を変数urlから見つけます
一件でもあればbase64だと判断します
そしてreplace関数を使って接頭辞を削除します
最後にダウンロードの関数を実行して画像を保存します
実行できました
Google Driveを確認します
本田翼の画像がたくさんダウンロードできていました
base64の変換もうまくいっているようです
今回紹介したやり方はGoogle画像検索からスクレイピングをする方法ととても似ています
過去に橋本環奈さんの画像をGoogle画像検索からスクレイピングする動画も公開しています
そちらもぜひ見てください
余力のある人は発展課題にも挑戦してみてください
「本田翼」以外の検索ワードでも試してみましょう
「本田翼 かわいい」で検索したらダウンロード済みの画像があったとします。
それらの画像をダウンロードしないようにするにはどうしたらいいでしょうか
今回スクレイピングした画像は画質が悪く大きさも小さいです
高画質の画像をBing画像検索からスクレイピングする方法も考えてみてください
Bing画像検索はスクロールするたびに新しい画像が読み込まれます
スクロールして新しく読み込まれた画像もスクレイピングするにはどうしたらいいでしょうか
今回の動画がおもしろい、ためになったという方は高評価、チャンネル登録をお願い致します
またコメントで質問も募集しています
気軽にコメントしてもらえたら嬉しいです
では次の動画でお会いしましょう
取得したイメージタグには本田翼の画像以外のイメージタグも含まれています
本田翼のイメージタグのalt属性に注目します
本田翼のイメージタグのalt属性はすべて「Image result for 本田翼」になっています
Chromeで見ると「本田翼 に対する画像結果」になります
スクレイピングするとなぜか英語になってしまいました
スクレイピングするのに英語版でも問題はないです
そして通常の画像がsrc属性、base64はdata-src属性であることに注意して
それぞれの画像情報を取得します

#プログラミング #エンジニア #本田翼

10 comments
  1. 次のセルが自動的に出てくるようにするにはどういう設定が必要ですか?

  2. 動画ありがとうございます。ほかの動画も含めて、勉強になります。発展課題の一つ目はわかったのですが、ほかの2-4についてはわからず、お答えの動画をアップする予定はありますでしょうか?

  3. 字幕データ付きで読みやすいです、ありがとうございます!
    テーロプはキレイに打っていますね!何を使って編集していますか?

  4. とても分かりやすい動画をありがとうございます。
    画像スクレイピングの最後の
    googledriveのほぞ先のフォルダパスをコピーして「save_dir」の後に張り付けて
    実行させたら以下のようなエラーが表示されましたので解決法を教えてください

    0.jpg

    —————————————————————————

    NameError Traceback (most recent call last)

    <ipython-input-20-c3a719f2f23f> in <module>()

    23 save_base64_image(data=url, file_path=image_path)

    24 else:

    —> 25 download_image(url=url, file_path=image_path)

    NameError: name 'download_image' is not defined

    –>のある部分はリンク先のプログラムを貼り付けた個所になりますが
    なぜエラーが出たのかご教示いただけますでしょうか?

  5. いつもわかりやすい動画ありがとうございます。楽しんで勉強しています。
    Googleドライブではなく、自分のPCのディレクトリに画像を保存する場合はどのようにすれば良いのでしょうか?
    Pythonはほぼ初心者なので、稚拙な質問だとは承知しておりますが、ご回答いただければ幸いです。

  6. 他サイトに比べ、初学者には、分かりやすかったです。ありがとうございました。質問があるのですが、最後の自分のディレクトリを見る方法がわかりません。教えてください。お願いします。

  7. ありがとうございます。
    最後の所で下記のエラーが出るのですが原因はわからないでしょうか?
    すみません。

    5 save_dir = "/content/drive/MyDrive/colab-image"
    6
    —-> 7 for index, url in enumerate(img_urls):
    8 # enumerateを使えばリストのindexを取得できます。このindexをそのままファイル名にします
    9 # formatを使えば文字列内の指定した場所に変数の内容を入れることができます

    NameError: name 'img_urls' is not defined

  8. わかりやすい動画ありがとうございます。エラーは出ないのですが、データのタグが24(動画では47)、最終的な取得画像が11枚となります。また、本田翼さん以外の画像も含まれます。どんな理由が考えられるでしょうか。

  9. pythton初学者なのですが、動画の手順通りに行って上手く出来ました。
    私は本田翼さんではなく自分の好きな女優さんでやってみたのですが、上手く出来ると楽しいですねw
    それぞれのコードや文法の意味はまだ解りませんが、スクレイピングをやってみたい!Pythonに触れてみたい
    っていうのには私の様な初学者には本当に良い動画だと思います。

コメントを残す