概要
Ubuntu 20.04+からは、Chromiumの提供範囲が変わった影響で、Google Colab環境でChromiumを用いてWebスクレイピングを行う際に環境設定が必要になりました。
環境設定を行わずに、今まで通りに以下の方法でWebDriverをインスタンス化しようとするとエラーになります。
pip install selenium
from selenium import webdriver
webdriver = webdriver.Chrome("chromedriver")
日本語での解説記事が見つからず英語で色々調べる必要がありました。
今後Google Colab環境でChromiumを使いたい人の参考になれば幸いです。
環境設定
それでは環境設定を行います。
具体的には、Debian BusterのレポジトリからGoogle Colabに対応可能なバージョンのChromiumをインストールしていきます。
Google Colabで新しいノートブックを作ったら、まず最初に設定を行いましょう。
%%shell
# Ubuntuはスナップパッケージ外でのChromium-browserの提供をやめました。
# Debian busterを追加します。
cat > /etc/apt/sources.list.d/debian.list <<'EOF'
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster.gpg] http://deb.debian.org/debian buster main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster-updates.gpg] http://deb.debian.org/debian buster-updates main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-security-buster.gpg] http://deb.debian.org/debian-security buster/updates main
EOF
# キーを追加します。
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DCC9EFBF77E11517
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 112695A0E562B32A
apt-key export 77E11517 | gpg --dearmour -o /usr/share/keyrings/debian-buster.gpg
apt-key export 22F3D138 | gpg --dearmour -o /usr/share/keyrings/debian-buster-updates.gpg
apt-key export E562B32A | gpg --dearmour -o /usr/share/keyrings/debian-security-buster.gpg
# DebianのレポジトリからChromiumパッケージだけが欲しいと伝えます。
# 入力間に2列の改行があることに注意してください。
cat > /etc/apt/preferences.d/chromium.pref << 'EOF'
Package: *
Pin: release a=eoan
Pin-Priority: 500
Package: *
Pin: origin "deb.debian.org"
Pin-Priority: 300
Package: chromium*
Pin: origin "deb.debian.org"
Pin-Priority: 700
EOF
# ChromiumとChromium driverをインストール。
apt-get update
apt-get install chromium chromium-driver
# Seleniumをインストール。
pip install selenium
正直何を行なっているか詳しいことはわからないのですが、これをコピペして実行すればとりあえずインスタンス化ができるようになります。
Chromiumで手軽にウェブスクレイピングを行うためには、この方法がおすすめです。
補足
環境設定とは別なのですが、Seleniumの最新パッケージでは要素を取得するための以下のメソッドが消されています。
webdriver.find_elements_by_ロケーター("ロケーター名")
#例: webdriver.find_elements_by_id("id_name")
確かにロケーターごとにわざわざ違うメソッドを呼び出すのは無駄のある動きだったのかもしれません。
今後は、Byクラスを使用する必要があります。
from selenium.webdriver.common.by import By
webdriver.find_elements(By.ロケーター, "ロケーター名")
#例: webdriver.find_elements(By.CLASS_NAME, "class_name")
こちらの方が少しスマートに見えます。
さらに、すっきりした上にロケーターを宣言するときには大文字で叫んでいるようで、主張が強めなのも好印象です。
おわりに
今回はGoogle Colab上でSeleniumのWebdriverを使えるようにするための環境構築を行う方法をお伝えしました。
ついでに指定のWebページから要素を取得する方法も紹介しました。
find_elements_by_id()などというメソッドはベンチから外され、find_elementsやfind_elementの独壇場になっているのでご注意ください。
参考)https://github.com/googlecolab/colabtools/issues/3347#issuecomment-1387453484