Seleniumを使ってweb上の画像をスクレイピングしよう[python]

# はじめに
業務でseleniumを使ってスクレイピングをする機会があったので、基本を簡単にまとめてみました。今回はseleniumの環境構築の方法と検索欄に「イラスト屋」と入力しその画像をスクレイピングするところまでを書いていきたいと思います。


## 開発環境(筆者の)
・python3.7.3
・chromeのバージョン: 74.0.3729.169
・mac


## 最終的なコード

```scraiping.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import requests
import os

driver = webdriver.Chrome("/Users/ユーザー名/chromedriver")

driver.get("https://www.google.co.jp/imghp?hl=ja&tab=wi&ogbl")
driver.find_element_by_name("q").send_keys("イラスト屋",Keys.ENTER)
# 現在のページのurlを変数に入れる
current_url = driver.current_url
html = requests.get(current_url)
bs = BeautifulSoup(html.text, "lxml")
images = bs.find_all("img", limit=10)
# imgフォルダの作成
os.makedirs("img")
# 取得した画像をループして保存
for i,img in enumerate(images, start=1):
  src  = img.get("src")
  responce = requests.get(src)
  with open("img/" + "{}.jpg".format(i), "wb") as f:
    f.write(responce.content)
driver.quit()
```


## 事前準備
今回必要なライブラリは以下になります
・selenium
・requests
・beautifulsoup4
・lxml

以上の4つをインストールしておいてください！

```
pip install selenium
pip install requests
pip install beautifulsoup4
pip install lxml
```

インストールが完了したらファイルに以下のように記述してください

```scraiping.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import requests
import os
```

「import os」は後ほどディレクトリを作る際に必要になります。


次にchromedriverをインストールします。
http://chromedriver.chromium.org/downloads
このページから自分のchromeバージョンにあったdriverをインストールしてください。
ダウンロードが完了後にzipファイルを解凍すると「chromedriver」があるので、ドライバーを自分のホームディレクトリ内に移動させてください。



ドライバーを移動させたら次はパスを通します。
先ほどのファイルに以下のように記述してください

```scraiping.py
driver = webdriver.Chrome("/Users/ユーザー名/chromedriver")
```
これでドライバーにパスを通すことができます。



## 画像をスクレイピング

seleniumの準備ができたので、ここからchromeでの画面遷移とスクレイピングをしていきたいと思います

まずは、検索欄に文字を入力して検索するところまでを書いていきます

```scraping.py
driver.get("https://www.google.co.jp/imghp?hl=ja&tab=wi&ogbl")
driver.find_element_by_name("q").send_keys("イラスト屋",Keys.ENTER)
```

1行目のdriver.getで引数で渡されたurlを読み込んでブラウザを起動させています。
2行目では、driver.find_element_by_name（"q"）でname属性が「q」の要素を取得し、send_keysでその要素に「イラスト屋」と入力し、ENTERを押してと指示しています。Googleのトップ画面を検証で確認すると検索フォームのname属性が"q"になっていることがわかります。

ここまで記述したファイルを実行するとブラウザが立ち上がって、イラスト屋の画像一覧が表示されていると思います。


次は、画像を入手するためにhtmlを解析して、imgタグ要素を取得しましょう！
ファイルに以下のように記述してください。

```scraping.py
current_url = driver.current_url
html = requests.get(current_url)
bs = BeautifulSoup(html.text, "lxml")
images = bs.find_all("img", limit=10)
```

簡単に説明していきます。
1行目は、現在表示されているブラウザのurlを取得して変数に格納
2行目はrequestsを使って、そのurl内の情報を取得し変数に格納
3行目は取得した情報を解析し、html構造を変数に格納(.textをつけないと解析されないので注意です)
4行目は変数「bs」にhtml構造が入っているので、その中にあるimgタグを10件取得してと指示しています(limitをつけないと画像を全て入手してきてしまうので気をつけてください!)

ここまで完了したら、後は画像を保存する作業だけです。 for文でサイクルをまわしましょう！
先に画像を保存するためのディレクトリを作るので、以下のように記述してください

```scraping.py
os.makedirs("img")
```
これによりカレントディレクトリにimgフォルダが作成されます！





では、画像の保存をしていきます。
以下のように記述してください

```scraping.py
for i,img in enumerate(images, start=1):
  src  = img.get("src")
  responce = requests.get(src)
  with open("img/" + "{}.jpg".format(i), "wb") as f:
    f.write(responce.content)
driver.quit()
```

説明していきます。
今回は画像の名前を連番にしたかったのでenumerate関数を使いました。要素と一緒にインデックス番号を返してくれる便利な関数です。 処理の流れは
1 imgタグのsrc属性を取得して変数に格納し、requests.getで画像情報を取得。
2 with openでimgフォルダ内に(番号.jpg)という名前で書き込みますよと命令
3 f.writeでresponceに格納されている画像を書き込む
4 ブラウザを閉じる
といった感じです。


実行するとイラスト屋の画像が10枚保存されていると思います。
imgタグを取得する際に指定したlimitを調整すれば10件以上の取得も可能です！


## おわりに
今回は簡単なスクレイピングでしたが、使いこなせればネット上の情報を自由に収集できて非常に便利ですね。次はtwitterAPIを用いたスクレイピング等に挑戦しようと思います。

____________________________________

ここまで読んでいただきありがとうございます。間違い等がありましたらご指摘いただければ幸いです。