TonamiLog

ゆるキャン△とヤマノススメ

pythonとselenium

ハロートナミです。元気?

最近ワークでseleniumのお勉強をしたので備忘録を産みます


Seleniumとは

driverを操作してブラウザを動かすフレームワークとのこと。

今回はpythonから使う。


導入

pip install selenium

別途動かしたいブラウザのdriverが必要なので落とす。

chromeならchrome webdriverとかでググれば出てくる。

使ってるブラウザとdriverの対応バージョンを要確認とのことだったが、どっちも最新にしてれば多分動く。

使ってみる
from selenium import webdriver
 
# ブラウザ起動
driver = webdriver.Chrome('WebDriverを落としたところ/chromedriver.exe')
# google.comにアクセスして表示
driver.get('https://www.google.com/')

そのへんのチュートリアル読んでとりあえず書いたソース。

これを実行するとchromeが開いて、google.comが表示される。

webdriverってのは導入で落としてきたdriverのことで、exeファイルを直接パスで指定する。

.getはgetリクエストを送れってことであってるよな……?


ツールでブラウザを動かす場合、最後はブラウザを閉じた方がお行儀がいいんだろうけど
開発中はすぐ閉じちゃうと何が起きてるかわからんので開きっぱにしておく。

なお、閉じる時は

driver.quit()

とかで閉じれる。


seleniumで出来る事をもう少し掘っていく

from selenium import webdriver
 
# ブラウザ起動
driver = webdriver.Chrome('WebDriverを落としたところ/chromedriver.exe')
# google.comにアクセスして表示
driver.get('https://www.google.com/')

# 検索フォームに文字列を渡す
formInput = driver.find_element_by_xpath('//*[@id="lst-ib"]')
formInput.send_keys('TonamiLog')

# 検索実行
btnSend = driver.find_element_by_xpath('/html/body/div/div[3]/form/div[2]/div[3]/center/input[1]')
btnSend.click()

xpathとかいう概念が出てくる。
xpathとは何かを書くと大変なので省くけどざっくり言うとHTML中の特定要素を指定するための構文です。

driver.find_element_by_xpath('hoge')

これはselenium頻出関数と思われるファインドエレメントバイxpathさんです。
xpathを見て特定エレメントを取得してくれます。そのまんま。
idとかclass名とかでもエレメント取得出来るんだけど、xpathが一番汎用性高いっぽい。
エレメント取得したらそれを操作していきます。

例えば

# 検索フォームに文字列を渡す
formInput = driver.find_element_by_xpath('//*[@id="lst-ib"]')
formInput.send_keys('TonamiLog')

は、idがlst-ibのHTMLタグからエレメントを探してきて
見つかったエレメントにTonamiLogって文字列を渡してる。
これをするとGoogle.comの検索フォームにTonamiLogって文字が入る。すげえ

次に

# 検索実行
btnSend = driver.find_element_by_xpath('/html/body/div/div[3]/form/div[2]/div[3]/center/input[1]')
btnSend.click()

ですが、これは親要素から順に相対パスでエレメントを探してきて
見つかったエレメントをクリックしてます。
これをするとGoogle.comの検索ボタンが押されて検索が実行される。すげえね

最初のうちはページのソース見て唸りながらxpath書いてたんだけど、
普通にデベロッパーツールからエレメント指定して、ソース右クリック>コピー>xpathで要素のxpathがコピー出来ました。
f:id:Thiroyuki:20180517124534p:plain
文明~!

ちなみに、スクレイピングしたいサイトがアプデされたりして構成が変わるとxpathの指定が狂うので
都度指定し直すかid等絶対パス風に指定出来る仕組みを考えたらいいと思います。

send_keys()とclick()の他にはtextとかがあって、その要素の持つ文字列を簡単に取得出来るし
なんならget_attribute('hoge')でなんでも取得出来ます。get_attribute('value')とかget_attribute('innerHTML')とか
このへんまで理解出来るとブラウザ操作は自由自在で基本的な事はだいたい出来ます。やったね

ちなみにajaxとかの非同期処理で来る値をスクレイピングしたい場合にはWebDriverWaitとかの仕組みが用意されていて
説明省くけどajaxの結果が来たらhogehogeとかも書けます。ググるといっぱい出てくる


これで自由にえっち画像をスクレイピング出来るし
Webアプリをブラウザ経由で自動テストしたり
自社のポータルサイトを自動で操作して悪いことが出来るとか
夢が広がるね。よかったですね。