Seleniumを使ったWebスクレイピング
Selenuimを使う
Seleniumを使ってみたときのメモ
webスクレイピングというよりは、webのtest用に使う用途がメイン。 Scrapyはクロールするにはとても便利なんだけど、 Javascriptで生成されるページが多くなってきたので、それを含めてページ要素を評価したいとか、 表示が出てきたらそれに対応したボタンやインプットをしたいとかいう用途のときに使う。
seleinumのquick start
seleniumはwebdriverと呼ばれるブラウザのコントローラーを使って、ブラウザを起動し、その結果を取得して解析に利用する。なので、seleniumだけではなくて、対応するブラウザのインストールも必要となる。 Pythonを使っている場合はpipでパッケージマネージャーまで提供されている。自分はpythonを使うのでそれを利用する。
seleniumのインストール
seleniumの本体をインストール。pip経由でインストールする。 またwebdriver-managerも一緒にインストールする
pip install selenium
pip install webdriver-manager
webdriverを利用したchromedriverのインストール
webdriver-managerを利用するとコード書いてdriverをインストールできる。これはchrome-driverの場合 公式のgithubにサンプルコードが乗っているので、他のブラウザはそこを参照するとよい。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
service = Service(ChromeDriverManager().install())
webページを取得する
インストールが済んだら、getを使ってページを取得する。 こんな感じで動かせる(メモなので実コードではないので、実際には動かないから適宜読み替えてほしい)。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
#optinosで--headlessを指定するとブラウザが起動しなくなる。
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
results = []
#yahoo japanを開く
driver.get('https://www.yahoo.co.jp')
#Actionを設定して、ページを開いた後にendキーを押すようにしてページの下まで行くようにする。
action = webdriver.ActionChains(driver)
action.key_down(Keys.END).perform()
#表示された<a class="link">のタグのhrefとtextを取得する
for e in driver.find_elements(By.CSS_SELECTOR, "a.link"):
tmp={}
tmp['href'] = e.get_attribute('href')
tmp['text'] = e.text
results.append(tmp)
selectorなど
find-elementsメソッドにBy.TAG_NAME, By.IDとかを指定して記述していく。 ググったりして出てくるfruits.find_elements_by_idなどのメソッドは古いので、適宜By.***(selenium4以降)に書き換えていく。
keyboardの入力を入れる
send_key(Keys.ENTER)とするとキーボードの入力を送信できる。また複数のキーを連結させたい(シフト+英字など)ときはActionChainsを使っていく。
まとめなど
ざっくりとseleniumのドキュメントを読んで、使ってみた。やりたいことをできる範囲では理解できたので、後は必要に応じてドキュメントを読んだりしていこう。
seleniumを使うとjavascriptで生成されているサイトも評価することが可能で、そこまで面倒なく実装できる。 ただ、scrapyにあったDownloaddelayとかアクセス制御とかはまた別の方法を用意する必要がありそう。 現状はそこまで利用しないので、必要になったら考えよう。
pythonを使ってるとrequests, beautifullsoupとかがスクレイプの基本って出てきがちだけど、 実際のところScrapyかselenium使ったほうがコード量も導入も楽なのでこっちを選んだ方が良さげかなぁ。