GoogleColaboratoryにSeleniumの実行環境を用意する（失敗）

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

参考にしたのはこちらのQiita記事。
[Colaboratory上でSeleniumが使えないか試した(そしてダメだった)](https://qiita.com/FrozenVoice/items/5348a74feeb5e8b8b8ad)
結論から言いますと、ぼくも失敗しました。

## Seleniumとは

> Seleniumとは、Webブラウザを使ってWebアプリケーションをテストするツールです。この「Webブラウザを使って」というのが非常に大きなポイントで、人が手でWebブラウザを操作する代わりにSeleniumがWebブラウザを操作してくれるのです。（https://thinkit.co.jp/free/article/0705/2/1/）


こいつ本当にすごくて、ログイン必要なサイトも簡単にスクレイピングができる超すぐれものです。本当はテストツールなんですが、負荷が大きいことを除けば怖いもの知らずのスクレイピングツールになります。

ちょうど去年の今頃、このツールでいろいろ試していたので、興味があれば見てみてください。

[PythonとSeleniumで自分のツイートを抽出する](https://www.taikomegane.com/entry/2017/07/01/173359)
[JavaとSeleniumで自分のツイートを抽出する](https://www.taikomegane.com/entry/2017/07/01/201337)



## １．必要なモジュールをインストールする
まずはSeleniumに必要なモジュールを整えていきます。

```console:Console
!pip install selenium
!wget https://chromedriver.storage.googleapis.com/2.38/chromedriver_linux64.zip
!unzip chromedriver_linux64.zip
```

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

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


## ２．実行してみる（１回目）
今回実行で使うのは、最初に紹介したQiitaの記事をそのままやります。

```sample01.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# headless-chromeの立ち上げ　
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)

```

結果はこちら

```console:実行結果
WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
```

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


## ３．chromedriverのパスを通す
そもそもこれchromedriverどこにインストールされたんだ？と疑問に思ったので探します。

```console:Console
!pwd
!ls
```

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

```console:実行結果
/content
chromedriver  chromedriver_linux64.zip	datalab
```

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

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

```sample02.py
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)
```

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

```console:実行結果
WebDriverException: Message: Service chromedriver unexpectedly exited. Status code was: 127
```

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


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

[Python selenium ChromeDriver がエラー127 で起動しない場合、libgconf2 をインストール](http://b.ytyng.com/blog/python-selenium-chromedriver-error-127-install-libgconf2/)


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

```console:Console
!apt install libgconf2-4
```

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

```console:実行結果
WebDriverException: Message: Service /content/chromedriver unexpectedly exited. Status code was: 127
```

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

```console:Console
!/content/chromedriver
```

結果はこちら

```console:実行結果
/content/chromedriver: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory
```

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

```console:Console
!apt install libnss3-dev
```

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

```console:実行結果
WebDriverException: Message: Service /content/chromedriver unexpectedly exited. Status code was: -6
```

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

```console:実行結果
src/tcmalloc.cc:283] Attempt to free invalid pointer 0x117499c73fc0 
Aborted (core dumped)
```

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


今日はここまで。明日以降またがんばります。

本記事はこちらの転載になります
[GoogleColaboratoryにSeleniumの実行環境を用意する（失敗）](https://www.taikomegane.com/entry/2018/07/18/231944)