【Python × Selenium】スクレイピングやテスト自動化に使えるライブラリ

Pythonの本 フリーランスエンジニアの働き方

スクレイピングという言葉を聞いたことはあるでしょうか?プログラムを使って、Webサイトから様々な情報を取得することを言います。通常人間が閲覧するWebサイトを機械が閲覧して、情報を取得します。
また、Webシステムのテストで、何度も繰り返すUI操作を自動化させたい、というニーズもあります。

このスクレイピングやテスト自動化に使えるライブラリがSeleniumです。Webサイトを自動操作することに長けたライブラリで、JavaScriptが動的に内容を変えるようなWebサイトでもスクレイピングすることができます。

SeleniumはJavaやRubyなどにも対応していますが、Pythonにも対応しています。

今回は、そんなPython版Seleniumの使い方を紹介します。

スポンサーリンク

Seleniumとは?

Seleniumは、元々Web自動操作のために開発されたライブラリです。

しかしその特性を活用し、スクレイピングにも使われています。

PythonでスクレイピングするライブラリというとBeautifulsoapがありますが、Beautifulsoapではロード時にDOMが全て決定されるWebサイトしかスクレイピングできません。ECサイトなどはBeautifulsoapで対応可能ですが、時に、刻々と内容が変わるWebサイトをスクレイピングしたいというときがあります。そんなときはSeleniumの出番です。

Seleniumのインストール

Seleniumのライブラリは

pip install selenium

でインストールします。

が、Seleniumはこれだけでは動作しません。

ブラウザごとに開発されている、Webドライバーという実行時にPythonプログラムと同時に実行されるソフトウェアが実行環境にインストールされている必要があります。

Chrome向けのChromeDriverはこちらから。

ChromeDriver - WebDriver for Chrome
WebDriver is an open source tool for automated testing of webapps across many browsers. It provides capabilities for navigating to web pages, user input, JavaS...

ダウンロードのリンク先に、Windows、Mac、Linuxそれぞれのバージョンがあります。

Firefox向けGekkoDriverはこちらから。

Releases · mozilla/geckodriver
WebDriver for Firefox. Contribute to mozilla/geckodriver development by creating an account on GitHub.

各OS向けがありますね。

ここで注意。Linuxでは、必ずPythonから実行可能なディレクトリにWebドライバーをインストールしてください。Pythonスクリプトと同じディレクトリにインストールしても、通常実行可能ではありません。

Seleniumスクリプトの書き方

まず、Seleniumからwebdriverをimportします。

from selenium import webdriver

そして、Seleniumが操作するブラウザを立ち上げて、Webサイトにアクセスします。

driver = webdriver.Firefox()
driver.get("https://www.google.co.jp/")

それからスクリプトを記述します。

終わったら、

driver.quit()

でブラウザを閉じます。

Selenium入門

ここでは、簡単な例として、Googleにアクセスし、検索キーワード「Python」で検索させてみるスクリプトを書いてみます。

初めに、スクリプト全文を掲載しておきます。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("https://www.google.co.jp/")

wait = WebDriverWait(driver, 180)

element = wait.until(expected_conditions.presence_of_element_located((By.XPATH, "/html/body/div/div[2]/form/div[2]/div[1]/div[1]/div/div[2]/input")))
element.send_keys("Python")

webdriver.ActionChains(driver).send_keys(Keys.ENTER).perform()

#driver.quit()

要素を取得する

まず大前提として、要素が出現するのを待たなければなりません。

wait = WebDriverWait(driver, 180)

と書くと、要素が出現するのを待つ最大秒数が決められます。通信環境、Webサイトの重さに応じて調整します。

wait.until

でDriverを待たせます。

expected_conditions.presence_of_element_located

で要素が出現するのを捕まえています。

ここでは、XPATHで捕まえています。
XPATHとは、そのWebサイト内での要素の絶対的な位置を示す書き方です。このDOM階層のところに要素があります。
Firefoxの場合、インスペクターを表示させHTMLソースから右クリックでコピーできます。

要素に値を渡す

element.send_keys("Python")

は、Pythonという文字列を要素に送っています。テキストフィールドなら当然入力されます。

その下の

webdriver.ActionChains(driver).send_keys(Keys.ENTER).perform()

はENTERキーを押しています。これはこういう書き方をします。

要素をクリックする

このスクリプトでは出てきませんが、要素をクリックするのは

element.click()

です。Googleの場合、検索履歴が表示されボタンがうまくクリックできないので、ENTERキーを押したのでした。

まとめ

この記事では、Seleniumの基本について見てきました。

最後に、Seleniumの開発で参考になるサイトを案内しておきます。

Selenium API(逆引き)
Selenium APIを目的別に紹介します(Selenium RCのAPIは除く)。言語別にそれぞれ使い方ページにリンクが張られており目的別に利用したいメソッドを探すことが出来ます。

Seleniumで機能から関数名を引くサイトです。Seleniumでやりたいことが定まったらこのサイトで関数名を調べればいいでしょう。

Seleniumでは様々なサイトをスクレイピングできます。筆者もスクレイピング困難かと思われたサイトをいくつもスクレイピングしてきました。タイミングの調整やより良い要素の指定方法など、スクレイピングにはコツがありますが、それも開発していけば習得できます。あなたも、スクレイピングに踏み出してみてください。

エージェントへの登録はお済みですか?

今すぐフリーランスになる気がなくても、エージェントへの登録は済ませておくことをお勧めします。理由はストレスや疲労が限界に達してからだと遅いから。

現在の自身のフリーランスとしての価値・単価相場を把握できますし、条件にあった案件をキャッチできるようになるので、いざフリーランスになろうとした際に早期に手が打てます。

エージェント登録は無料なので、今はフリーランスにならなくとも登録だけはしておくべきです。

真っ先に登録すべきエージェントは、圧倒的に多くのクライアントを開拓しているDYMテック。2500社の優良な取引先と、条件交渉力が強く高条件で仕事を紹介してくれるエージェントです。

案件紹介のみでなく、エンジニアとしてのキャリア相談や業界動向のキャッチアップなど、フリーランス対してのサポートも充実していますので、初めてフリーランスに挑戦する方も安心です。

DYMテックの詳細を見る

フリーランスエンジニアの働き方
スポンサーリンク
shigotoswitchをフォローする
しごとスイッチ