この記事で解決できる内容
Google画像検索から画像を自動保存するプログラムを作成したので、コピペして使ってください。
今回はプログラムを実行すると最初にキーワードの入力が求められ、入力したキーワードに関連する画像をフォルダに保存してくれるプログラムです。
コピペするだけでも十分使えると思いますが、用途に合わせて改良もできると思うのでぜひ使ってください!
スクレイピング習得はUdemy
- 最大95%OFFで有料コンテンツが購入可能!
- ITスキルを本よりもわかりやすく体系的に学べる!
- スキマ時間で学習が可能!
合わせて読みたい
-
本よりお得にスクレイピング習得!おすすめのUdemy講座3選
続きを見る
プログラムコードの全貌【コピペして使ってください!】
#利用するライブラリ(モジュール)をインポート
import requests
from time import sleep
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import os
#google画像検索にアクセス
options = webdriver.ChromeOptions()
options.add_argument("--headless")
browser = webdriver.Chrome(ChromeDriverManager().install(),options=options)
url = "https://www.google.co.jp/imghp?hl=ja"
browser.get(url)
#まずは特定の画像を検索する
kw_search = browser.find_element_by_css_selector("#sbtc > div > div.a4bIc > input")
from selenium.webdriver.common.keys import Keys
actor_name = input("画像検索したいものや人のKWを入力してください!:")
kw_search.send_keys(str(actor_name))
kw_search.send_keys(Keys.ENTER)
#BeautifulSoupで画像検索したページの画像を取得する
cur_url = browser.current_url
res = requests.get(cur_url)
soup = BeautifulSoup(res.text,"html5lib")
img_tags = soup.find_all("img",limit = 10)
img_urls = []
for img_tag in img_tags:
url_a = img_tag.get("src")
if url != None:
img_urls.append(url_a)
#取得した画像のデータを保存する
save_dir = "画像ダウンロードフォルダ/"
if not os.path.exists(save_dir):
os.mkdir(save_dir)
a=1
for elem_url in img_urls:
try:
r = requests.get(elem_url)
with open(save_dir + str(actor_name) +"画像"+str(a)+".jpg","wb") as fp:
fp.write(r.content)
a += 1
sleep(0.1)
except:
pass
browser.quit()
プログラムコードの解説
中身をわかりやすく解説していきます。
ただただプログラムだけを実行させたい場合はコレより下は読まなくてもOKです!
大まかな流れは以下。
- 使用するライブラリのインポート
- ブラウザの起動とサイトへアクセス
- キーワードを設定し画像検索
- 画像の情報を取得
- 画像を保存
詳しく見ていきましょう。
STEP1:使用するライブラリの宣言
#利用するライブラリ(モジュール)をインポート
import requests
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import os
from time import sleep
このプログラムで使用したライブラリは、6つです。
- requests
- selenium
- webdriver_manager
- BeautifulSoup
- os
- time
requestsはURL内のHTMLを取得するモジュール
import requests
requestsはURLを解析するためのライブラリです。
requestsを使うことで、画像のURLを読み込んで保存したりするときに使います。
selenium はブラウザを操作するためのライブラリ
from selenium import webdriver
selenium(セレニウム)と呼ばれる、ブラウザを操作するライブラリのなから、webdriverと呼ばれる、ブラウザにアクセスするためのモジュールをインポートしています。
基本的にSeleniumを使っての操作は、Webdriverを使ってブラウザの操作を行っています。
合わせて読みたい
-
【Pythonライブラリ】Seleniumとは?インストールと実装準備について解説
続きを見る
webdriver_manager はブラウザを起動する時使うライブラリ
from webdriver_manager.chrome import ChromeDriverManager
Webdriver_manager は、ブラウザのバージョンを自動で合わせてくれるお手軽キッドです。
通常の、webdriverだとあなたのPCにインストールされているブラウザ(GoogleChromeなど)のバージョンと、Webdriverが起動しようとするブラウザのバージョンが異なるとエラーで開けません。
その為、いちいちブラウザのバージョンを変更する手間がかかります。
そんなときに便利なのがwebdriver_managerです。
ブラウザを起動するたびに、バージョンを合わせてくれますので、バージョンが違うことに対するエラーにおびえる必要がありません。
BeautifulSoup はHTMLを解析するためのライブラリ
from bs4 import BeautifulSoup
BeautifulSoup はHTMLを解析するためのライブラリです。
例えばサイトの画像だったり、書いてあるテキスト、表の中の特定のキーワードだけを取得したい時などに使います。
osモジュールでディレクトリの操作などができるモジュール
import os
osモジュールは、パソコンに画像を保存するときに使います。
他にも、作業ディレクトリを確認チェックしたり、新しいファイルやディレクタを作成したり、名前を変更したりするときに使えるモジュールです。
timeライブラリは小休憩を挟む時に使えるライブラリ
from time import sleep
timeパッケージの中から、sleepモジュールをインポートして、小休憩を挟みます。
スクレイピングで繰り返しサイトから画像をダウンロードしたりすると、サイトに負荷を掛けすぎてしまうことを対策すつときに使います。
STEP2:ブラウザを起動しサイト(Google画像検索)へアクセス
#google画像検索にアクセス
options = webdriver.ChromeOptions()
options.add_argument("--headless")
browser = webdriver.Chrome(ChromeDriverManager().install(),options=options)
url = "https://www.google.co.jp/imghp?hl=ja"
browser.get(url)
ヘッドレスモードでブラウザを起動する
options = webdriver.ChromeOptions()
options.add_argument("--headless")
browser = webdriver.Chrome(ChromeDriverManager().install(),options=options)
単純にwebdriverでアクセスすると、プログラムの実行とともに、ローカルでブラウザが起動して自動でサイトが動いているのが見えるようになっています。
ヘッドレスモードは、見えないところでサイトが動いてくれるようにするモードです。
3行目のコードが実際のブラウザを起動させるコードです。,options=optionsを消すと通常モードでブラウザが起動します。
browser.get("URL")でURLにアクセスする!
url = "https://www.google.co.jp/imghp?hl=ja"
browser.get(url)
url = "ここにアクセスしたいURLを入力する"
そうすると、アクセスしたいサイトにアクセスできます。
STEP3:キーワードを指定して画像検索する
#まずは特定の画像を検索する
kw_search = browser.find_element_by_css_selector("#sbtc > div > div.a4bIc > input")
actor_name = input("画像検索したいものや人のKWを入力してください!:")
kw_search.send_keys(str(actor_name))
from selenium.webdriver.common.keys import Keys
kw_search.send_keys(Keys.ENTER)
上記は、google画像検索で、検索したいワードを検索ボックスの中に入力するコードです。
seleniumの使い方の基本は、「場所を指定 👉 アクション」です。
今回の場所は検索ボックス、アクションは、入力です。
browser.find_element_by_css_selector で場所指定
場所を指定する方法には、find_element_by_css_selector 以外にも、find_element_by_class_nameとかもありますが、今回は css_selector を使ってみました。
指定した場所.send_keys("入力したいキーワード")でキーワードを入力
send_keys("入力したいキーワード")で入力することができます。
今回は、input関数を使って、プログラムを実行する人が検索したいキーワードを入力できるようにしています。
Keysモジュールを使って最後にEnterを押す
from selenium.webdriver.common.keys import Keys でKeysモジュールを使えるようにインポートしておく。
Keysモジュールを使えば、Enterを押したり、Shiftキーを押しながらの操作が可能になるので、特殊文字を入力するときなどに使う。
今回は検索するときにEnterを押して検索するために使ってます。
STEP4:BeautifulSoupで画像情報を取得する
#BeautifulSoupで画像検索したページの画像を取得する
cur_url = browser.current_url
res = requests.get(cur_url)
soup = BeautifulSoup(res.text,"html5lib")
img_tags = soup.find_all("img",limit = 10)
img_urls = []
for img_tag in img_tags:
url_a = img_tag.get("src")
if url != None:
img_urls.append(url_a)
上記コードで行っているのは、下記3ステップです。
- 今操作しているサイトのページURLを取得する
- BeautifulSoupでページURLを解析する
- 画像のURLをリストに格納する
browser.current_urlで今操作しているサイトのURLを取得する
seleniumで用意されている current_url メソッドで操作しているページURLを取得することができます。
requestsとBeautifulSoupでHTMLを解析する
res = requests.get(cur_url)
soup = BeautifulSoup(res.text,"html5lib")
requests.get("URL") でURLのサイトを構築しているHTMLを取得することができます。
取得したHTMLを res に格納して、res を BeautifulSoup で解析するのです。
BeautifulSoup(解析したいHTML,"パーサーの指定") で解析することができます。
パーサーとは、解析器のことで、 html5lib 以外にも lxml’s XML parser 等があります。
find_all を使って画像URLの取得
img_tags = soup.find_all("img",limit = 10)
img_urls = []
for img_tag in img_tags:
url_a = img_tag.get("src")
if url_a != None:
img_urls.append(url_a)
soup.find_all("img",limit = 10) でimgタグを10個を上限として取得して、img_tags に格納しています。
これだけだと、画像URL以外にも邪魔なものがimgタグに入っているので、for文を使って、取得したimgタグの中から、画像URLだけをきれいに取り出します。
STEP5:画像URLから画像をディレクトリに保存する
#取得した画像のデータを保存する
save_dir = "画像ダウンロードフォルダ/"
if not os.path.exists(save_dir):
os.mkdir(save_dir)
a=1
for elem_url in img_urls:
try:
r = requests.get(elem_url)
with open(save_dir + str(actor_name) +"画像"+str(a)+".jpg","wb") as fp:
fp.write(r.content)
a += 1
sleep(0.1)
except:
pass
上記コードの流れは以下のとおりです。
- 保存先を指定する
- 取得した画像URLの中身を取り出して、ディレクトリに保存する
保存先を指定する
save_dir = "保存先のフォルダ名をつけてください/" #最後の「/」が結構大事!!
if not os.path.exists(save_dir):
os.mkdir(save_dir)
save_dir = "保存したいフォルダの名前をつけてください/"
最後の「/」をつけ忘れると、Pythonの作業ディレクトリ内に保存されてしまって、指定したディレクトリには保存されないので注意してください。
if文を使って、作業ディレクトリ内に、指定した名前のディレクトリが存在しなかったら新しく作ってくれるようにしています。
取得した画像URLの中身を取り出して、ディレクトリに保存する
a=1
for elem_url in img_urls:
try:
r = requests.get(elem_url)
with open(save_dir + str(actor_name) +"画像"+str(a)+".jpg","wb") as fp:
fp.write(r.content)
a += 1
sleep(0.1)
except:
pass
for文とrequestsを使って画像URL1つずつアクセスして、with open() で保存します。
with open() を使って、ディレクトリを開きます。
fp.write() で画像URLの中身を書き込みます。
try関数を使って例外処理が来たときの対策をしておきます。コレは画像URLじゃないものが紛れ込んでいたときにスルーしてもらうために記載しています。
Pythonでスクレイピングを学習したいならUdemyがおすすめ!
Pythonでスクレイピングを習得したいなら、Udemyがおすすめです。
Udemyは、学習したい人と教えられる人とをマッチングさせられるプラットフォームで、スクレイピングのプロたちが動画コンテンツを提供してくれているので、それを見て学習を進めることができます。
僕も実際にスクレイピングはUdemyで学習したので、おすすめです!
以下の記事でおすすめのUdemy講座を紹介しているのでよかったら読んでみてください!!
合わせて読みたい
-
本よりお得にスクレイピング習得!おすすめのUdemy講座3選
続きを見る
まとめ
今回は、google画像検索から、取得したい画像のキーワードを入力すると自動で保存してくれるプログラムを作成してみました。
全然完璧ではないと思うので、ちょいちょい改良して使ってみてください!
Pythonを習得することで、Google画像検索から画像を取得するだけでなく、メルカリの商品情報を取得したり、Twitterのbotを作成したりとさまざまなことができます。作りたいものがあるのであれば是非Pythonを習得しましょう!
Pythonを一番早く習得するには、プログラミングスクールやオンライン講座の活用が重要です。以下の記事では、Pythonが学べるプログラミングスクールを料金や学習目的など色々な観点から比較していますので、よかったら読んでみてください!
合わせて読みたい
-
【徹底比較】Pythonが学べるプログラミングスクールおすすめ12社
続きを見る