最近GoogleColaboratoryでスクレイピングを試しています。
今日は自動テストなどに用いるSeleniumをGoogleColaboratoryで動かせないかチャレンジしてみました。
参考にしたのはこちらのQiita記事。
Colaboratory上でSeleniumが使えないか試した(そしてダメだった)
結論から言いますと、ぼくも失敗しました。
Seleniumとは
Seleniumとは、Webブラウザを使ってWebアプリケーションをテストするツールです。この「Webブラウザを使って」というのが非常に大きなポイントで、人が手でWebブラウザを操作する代わりにSeleniumがWebブラウザを操作してくれるのです。(https://thinkit.co.jp/free/article/0705/2/1/)
こいつ本当にすごくて、ログイン必要なサイトも簡単にスクレイピングができる超すぐれものです。本当はテストツールなんですが、負荷が大きいことを除けば怖いもの知らずのスクレイピングツールになります。
ちょうど去年の今頃、このツールでいろいろ試していたので、興味があれば見てみてください。
PythonとSeleniumで自分のツイートを抽出する
JavaとSeleniumで自分のツイートを抽出する
1.必要なモジュールをインストールする
まずはSeleniumに必要なモジュールを整えていきます。
!pip install selenium
!wget https://chromedriver.storage.googleapis.com/2.38/chromedriver_linux64.zip
!unzip chromedriver_linux64.zip
ここまでは普通にクリア。やっていることは大きく2つです。
- Seleniumをインストールする
- GoogleChromeを制御するChromeDriverをダウンロードして、ZIPを解凍する
2.実行してみる(1回目)
今回実行で使うのは、最初に紹介したQiitaの記事をそのままやります。
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)
結果はこちら
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を解決する
どうも調べてみると、このエラーコードがでるときは、必要なパッケージをインストールできてないときらしいです。
Python selenium ChromeDriver がエラー127 で起動しない場合、libgconf2 をインストール
というわけで、指示通りこちらで対応
!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に関する記事があんまり見つからないんですよね。
今日はここまで。明日以降またがんばります。
本記事はこちらの転載になります
GoogleColaboratoryにSeleniumの実行環境を用意する(失敗)