GoogleColaboratoryにSeleniumの実行環境を用意する(失敗)

f:id:cyclemem:20180718231525j:plain

一昨日に引き続き、GoogleColaboratoryでスクレイピングを試しています。 今日は自動テストなどに用いるSeleniumをGoogleColaboratoryで動かせないかチャレンジしてみました。

参考にしたのはこちらのQiita記事。

qiita.com

結論から言いますと、ぼくも失敗しました。

Seleniumとは

Seleniumとは、Webブラウザを使ってWebアプリケーションをテストするツールです。この「Webブラウザを使って」というのが非常に大きなポイントで、人が手でWebブラウザを操作する代わりにSeleniumがWebブラウザを操作してくれるのです。

thinkit.co.jp

こいつ本当にすごくて、ログイン必要なサイトも簡単にスクレイピングができる超すぐれものです。 本当はテストツールなんですが、負荷が大きいことを除けば怖いもの知らずのスクレイピングツールになります。 ちょうど去年の今頃、このツールでいろいろ試していたので、興味があれば見てみてください。

www.taikomegane.com

www.taikomegane.com

1.必要なモジュールをインストールする

まずはSeleniumに必要なモジュールを整えていきます。

!pip install selenium

!wget https://chromedriver.storage.googleapis.com/2.38/chromedriver_linux64.zip

!unzip chromedriver_linux64.zip

ここまでは普通にクリア。やっていることは大きく2つです。

  1. Seleniumをインストールする
  2. GoogleChromeを制御するChromeDriverをダウンロードして、ZIPを解凍する

2.実行してみる(1回目)

今回実行で使うのは、最初に紹介したQiitaの記事をそのままやります。

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

 

options = Options()

options.add_argument('--headless')

executable_path="/usr/local/bin/chromedriver"

service_args=["--verbose", "--log-path=/content/chromedriver.log"]

 

driver = webdriver.Chrome(chrome_options=options, executable_path=executable_path, service_args=service_args)

 

//Googleのトップ画面を開く。

driver.get('https://www.google.co.jp/')

print(driver.page_source)

結果はこちら

WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

案の定エラーです。これはchromedriverにパスが通ってないので、まずはこれに対処します。

3.chromedriverのパスを通す

そもそもこれchromedriverどこにインストールされたんだ?と疑問に思ったので探します。

!pwd

!ls

Colaboratoryでは、!をつければ普通にLinuxのコードが動くので、ディレクトリを探してみます。 結果はこちら。

/content

chromedriver chromedriver_linux64.zip datalab

どうやら今いるディレクトリが「content」で、ファイル下に「chromedriver」がありそうです。 というわけで、execute_pathを「/content/chromedriver」に変更してみます。

2回目実行してみます。chromedriverのパスを修正するのに加えて、いくつかコードを書き換えています。

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

 

options = Options()

options.add_argument('--headless')

options.add_argument('--disable-gpu')

driver = webdriver.Chrome(executable_path="/content/chromedriver", chrome_options=options)

 

// Googleのトップ画面を開く。

driver.get('https://www.google.co.jp/')

 

print(driver.page_source)

結果はこちら。すんなりは通してくれません。

WebDriverException: Message: Service chromedriver unexpectedly exited. Status code was: 127

今度はエラー127に対応していきます。

4.Status code 127を解決する

どうも調べてみると、このエラーコードがでるときは、必要なパッケージをインストールできてないときらしいです。

b.ytyng.com

というわけで、指示通りこちらで対応

!apt install libgconf2-4

ここで改めて実行するものの、 しかしこれでもなお出てくるエラー。コードは変わらず127。

WebDriverException: Message: Service /content/chromedriver unexpectedly exited. Status code was: 127

そこでchromedriverを単体で実行してみます。

!/content/chromedriver

結果はこちら

/content/chromedriver: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory

どうもここらへんが怪しいので、途中に出てくる「libnss3.so」で検索すると、「libnss3-dev」というパッケージをインストールする必要があるとのこと。

!apt install libnss3-dev

これでひとまず準備完了。改めて実行してみると

WebDriverException: Message: Service /content/chromedriver unexpectedly exited. Status code was: -6

ちょっと心が折れそうですが、ひとまずエラーコードは変わりました。127は解決した模様。 改めてchromedriverだけ単体で起動してみると、こちらもエラーコードは変わっていました。

src/tcmalloc.cc:283] Attempt to free invalid pointer 0x117499c73fc0

Aborted (core dumped)

とりあえずこの後、もう少しいろいろやればパスは通ってるしできないことなさそうなんですが、 ステータスコード−6に関する記事があんまり見つからないんですよね。

今日はここまで。明日以降またがんばります。 備忘録として残してみました。本日も最後までお付き合いいただきありがとうございました。