🌑

Python+selenumでchromeを動かすまで(Ubuntu)

2022/11/10に公開

最近はJavaScriptを使ったサイトがほとんどなのでPythonのrequestsライブラリだけでスクレイピングなんかをするのは難しくなってきていますね。
そんなときにはSelenumでブラウザを操作する必要があるのですが、Selenumはrequestsと違い使うのに準備が必要です。

というわけでこの記事ではSeleniumを使い始めるまでの方法を残します。

環境

  • Ubuntu 20.04
  • Python 3.8.6
  • Google Chrome 107.0.5304.110
  • Selenium 4.6.0
  • chromedriver-binary 107.0.5304.62.0

Ubuntu20.04はWSL2上のdockerコンテナで動かしています。(だからどうとかはないと思いますが一応)

Seleniumのインストール

これは簡単です。

pip install selenium

Chromeのインストール

Chromeのインストールはリポジトリの追加からやる必要があります。

# リポジトリの追加
$ sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'

# 公開鍵の登録
$ sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

# パッケージリストの更新
$ sudo apt update

# インストール
$ sudo apt install google-chrome-stable

# バージョン確認
$ google-chrome --version

chromedriver-binaryのインストール

SeleniumとChromeの間にはWebDriverが必要です。
今回はPythonでのみChromeDriverを使う予定なのでchromedriver-binaryというPythonのライブラリをインストールします。
Python以外でも使う予定がある場合はUbuntuにChromeDriver(Chrome用のWebDriver)を追加する必要があります。

ChromeDriverはChromeのバージョンに対応したものでないと動かないので注意しましょう!

# chromeのバージョン確認
$ google-chrome --version
Google Chrome 107.0.5304.110

# 上で確認したバージョンに対応したものをインストール
$ pip install chromedriver-binary==107.0.5304.62.0



chromedriver-binaryのバージョンは下のリンクで確認できます。
基本的にメジャーバージョン(今回だと107)が同じものの最新にすれば大丈夫かと思います。
https://pypi.org/project/chromedriver-binary/

動作確認

最後に簡単な動作確認です。
chromedriver-binaryをインポートしている場合、webdriver.Chrome()の引数にドライバーのパスを指定する必要はありません。便利ですね!

from selenium import webdriver
from selenium.webdriver import ChromeOptions
import chromedriver_binary

options = ChromeOptions()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
# options.add_argument('--disable-gpu')  # ページによって必要な場合がある模様

url = "https://zenn.dev/"
driver = webdriver.Chrome(options=options)
driver.get(url)

print(driver.title)
driver.quit()

>>> Zenn|エンジニアのための情報共有コミュニティ

ハマったところ

"--headless"オプションを書いていなくてエラー

使っているUbuntuがCLIオンリーなのにoptions.add_argument("--headless")を指定していなかったのでエラーになりました。
単純なミスですがエラーメッセージが分かりにくくてハマりました。

chromedriver-binaryのバージョンが合わなくてエラー

上と違いこちらはエラーメッセージにバージョンが合わない旨が書いてあったのですぐ解決しました。
が、普通にpip install chromedriver-binaryしただけではバージョンが合わないことがあるので注意が必要です。

参考

Discussion