Python + Selenium + Chromeを使ったスクレイピングのチュートリアルです。
スクレイピングとは
プログラミングを駆使してWebページから情報を集めることを言います。
クラウドワークスなんかを見ていると、需要がちらほらある割に情報が少ないプチマニアックな分野です。
なぜSeleniumが必要か
SeleniumはWebページの自動テスト等に使われているブラウザ自動化ツールです。
昨今のWebページはメインコンテンツをAjaxで取得しているケースが多々あるので、URLを叩くだけでは望む情報が取れなかったりします。
なので、普段閲覧している様にブラウザ上でJavaScriptを評価して出来上がったHTMLから情報を抜き出す必要があります。
そのためにSeleniumを使ってブラウザをプログラムで操作してしまおう、ということです。
ちなみに、ブラウザを使用せずにスクレイピングしよう、もしくはヘッドレス(画面を描写しない)ブラウザを作ってスクレイピングしようという動きもちらほらあるのですが、大体の場合どツボにハマる事になります**(経験談)**
環境
Seleniumはあくまでブラウザ自動化ツールなので、ブラウザ本体とブラウザをつなぐもの(WebDriverといいます)が必要です。
今回はGoogle Chromeを使います。
- Mac: 10.14.2
- Chrome: 71.0.3578.98
- Python: 3.7.1
- Selenium: 3.141.0
- chromedriver-binary: 2.46.0
インストール
$ pip install selenium
$ pip install chromedriver-binary
実行
Googleのトップページからaタグを抜き出し、そのURLを抽出してみます。
import time
import traceback
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
options = Options()
# ヘッドレスモードで実行する場合
# options.add_argument("--headless")
driver = webdriver.Chrome(options=options)
try:
driver.get("https://www.google.co.jp/")
# 簡易的にJSが評価されるまで秒数で待つ
time.sleep(5)
# aタグを抽出
elem_list = driver.find_elements_by_tag_name("a")
for elem in elem_list:
# attributeの中からhrefを抽出して出力
url = elem.get_attribute("href")
print(url)
except:
traceback.print_exc()
finally:
# エラーが起きても起きなくてもブラウザを閉じる
driver.quit()
要素の抽出にはdriver.find_elements_by_tag_name()
を使用していますが、クラス名、nameなど、抽出の仕方は柔軟に選べます。Docsを見て下さい。
https://selenium-python.readthedocs.io/locating-elements.html
※Chromeのパスはchromedriver-binaryが勝手に通してくれます。
結果
URLがずらっと出力されます。
https://mail.google.com/mail/?tab=wm
https://www.google.co.jp/imghp?hl=ja&tab=wi
https://www.google.co.jp/intl/ja/about/products?tab=wh
https://myaccount.google.com/?utm_source=OGB&tab=wk&utm_medium=app
https://www.google.co.jp/webhp?tab=ww
https://maps.google.co.jp/maps?hl=ja&tab=wl
https://www.youtube.com/?gl=JP
https://play.google.com/?hl=ja&tab=w8
https://news.google.co.jp/nwshp?hl=ja&tab=wn
https://mail.google.com/mail/?tab=wm
https://contacts.google.com/?hl=ja&tab=wC
https://drive.google.com/?tab=wo
.
.
.
まとめ
簡単にWebスクレイピングが出来た。
応用として、ページ上でJSを実行したりクリックイベントを発火させたりして例えばログイン後のページの情報を取得したり、フォームにデータを入力してテーブルのフィルター、ソートを行うことも出来ます。
が、サイトによってはかなりハマるので注意して下さい。(特にAngularを使っているサイト)
ハマった場合はヘッドレスモードをやめて、デベロッパーツールを見てなぜ処理がうまくいかなかったのか調べてみて下さい。