Python
Selenium
スクレイピング
gdrive
colaboratory

ColaboratoryでSeleniumが使えた:javascriptで生成されるページも簡単スクレイピング

(2019年3月に新たに発生したエラーをご報告いただきましたので、2019/3/24に更新、また動くことを確認しました。)


実際に動いたコード

ColaboratorySeleniumを動かす方法を探している人のために、2018年12月現在、動いたコードを貼っておきます。上から順にColaboratoryのコードセルに貼っていくだけです。これでJavascriptで生成されるページのスクレイピングもColaboratoryで簡単にできます。 それ何、と思った人は、この下に背景などを書きましたので、ご覧下さい。便利ですよ!

#Chromiumとseleniumをインストール

#「!」印ごとColaboratoryのコードセルに貼り付けます。
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
!pip install selenium

#SeleniumとBeautifulSoupのライブラリをインポート

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

# ブラウザをheadlessモード(バックグラウンドで動くモード)で立ち上げてwebsiteを表示、生成されたhtmlを取得し、BeautifulSoupで綺麗にする。

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('chromedriver',options=options)
driver.implicitly_wait(10)
driver.get("https://スクレイピングしたいサイトのURL")
html = driver.page_source.encode('utf-8')
soup = BeautifulSoup(html, "html.parser")
print(soup.prettify())

あとは、HTMLタグを確認して欲しい内容を拾っていくなど普通のスクレイピングと手順は同じです。


背景

保険スタートアップのjustInCaseにはいろんな人がパートタイムでお手伝いに来てくれています。先日、CTOの@hkzmが、お手伝いに来て下さっているExcelの達人にPythonでデータ解析をやって頂こう、ということでGoogle Colaboratoryを紹介していました。横で眺めていて、Colaboratoryは設定なしでお手軽にPythonが使えるというだけでなく、Google Team Driveで共有できるので便利だということを知りました1。 ちょうど業務で、手でコピペしてたら死ぬ、という案件がありましたので、早速スクレイピングに使ってみることにしました。


おさらい:ColaboratoryでPythonを使った普通のスクレイピング

1件目は普通のスクレイピングで問題なく出来ました。ColaboratoryでPythonを使ってスクレイピングする方法には初心者向けの素晴らしい良記事がnoteにあって、本当に書いてある通りやれば私にもさくさく出来ました。大変おすすめです。


問題発生:javascriptで生成されるサイト

ところが、あるサイトが同じやり方では中身が取れないのです。どうやらjavascriptで生成されるサイトは、普通のやり方では出来ないようなのでした。で、色々調べた結果、Seleniumというライブラリを使えば出来そうだったのですが、あちこちで紹介されていたコードとColaboratoryでは相性が悪いのか、なかなかうまく行かず。Qiitaでも上手く行かない報告がいくつか上がっていたりしました。サポートが終了してレポジトリがアーカイブされているらしいphantomJSというwebDriverを使うやり方は見つかりましたが、今から幽霊ドライバー:ghost:を使うのはちょっとためらうかも。。。


解決策発見

で、探しまくって、stackoverflowで今月に回答されたやり方2でようやく動きました。 それが上に書いたコードです。このやり方だと、PhantomJSも使用しません。

なお、スクレイピングをするときは、本当に必要な情報だけを相手のサイトにご迷惑をおかけしないで取得するよう、用法・容量を守ってやりましょう。Enjoy!





  1. Team Driveを使うにはチームでGsuiteを使っている必要があります。Gsuiteのサイトから入って、次のプロモーションコードを入れると、Gsuite Businessプラン初年度の利用料金が20%引きになります。 T4UQLVFADL9FLR4  



  2. https://stackoverflow.com/questions/53532060/webdriverexception-message-service-content-chromedriver-unexpectedly-exited