Selenium 101

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など

Finding web Element

find-elementsメソッドにBy.TAG_NAME, By.IDとかを指定して記述していく。 ググったりして出てくるfruits.find_elements_by_idなどのメソッドは古いので、適宜By.***(selenium4以降)に書き換えていく。

keyboardの入力を入れる

Keyboard Actions 利用できるkeyの一覧

send_key(Keys.ENTER)とするとキーボードの入力を送信できる。また複数のキーを連結させたい(シフト+英字など)ときはActionChainsを使っていく。

まとめなど

ざっくりとseleniumのドキュメントを読んで、使ってみた。やりたいことをできる範囲では理解できたので、後は必要に応じてドキュメントを読んだりしていこう。

seleniumを使うとjavascriptで生成されているサイトも評価することが可能で、そこまで面倒なく実装できる。 ただ、scrapyにあったDownloaddelayとかアクセス制御とかはまた別の方法を用意する必要がありそう。 現状はそこまで利用しないので、必要になったら考えよう。

pythonを使ってるとrequests, beautifullsoupとかがスクレイプの基本って出てきがちだけど、 実際のところScrapyかselenium使ったほうがコード量も導入も楽なのでこっちを選んだ方が良さげかなぁ。

connvoi's Picture

About connvoi

肉とビールと料理と写真とゲーム たまに技術 python / Solr / PHP / ansible

アマゾンセール情報サイト アマセール管理人

Jp, Tokyo https://connvoi.com