Python+Selenium+WSLの環境を作った (2022年3月)


タイトルの通りですが,手元のWindows 10 WSL環境 (Ubuntu 20.04.4 LTS)にSeleniumとGoogle Chromeをインストールしたので手順をメモしておきます.

やったこと

Google Chromeをインストールします.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
mv google-chrome-stable_current_amd64.deb ~/tmp/
cd ~/tmp/
sudo dpkg -i google-chrome-stable_current_amd64.deb

Seleniumとドライバをインストールします.ドライバのバージョンは上でインストールしたGoogle Chromeに合わせました.

pip install selenium
pip install chromedriver-binary==99.0.4844.51.0

動作確認

上のように単にWSL内でChromeとSeleniumの環境を用意し,特に何もしないでpythonから利用すると,X server/DISPLAY関係の設定で怒られると思います.

> /opt/google/chrome/chrome
[2887:2887:0328/235335.331706:ERROR:ozone_platform_x11.cc(234)] Missing X server or $DISPLAY
[2887:2887:0328/235335.331760:ERROR:env.cc(225)] The platform failed to initialize.  Exiting.

この問題についてはこの記事では未対策です (というか上手い対応が毎回分からなかったり,上手くいったりいかなかったりします…).今回はheadlessのオプションをONにして利用してみます.簡単なプログラムでGoogleのトップページにアクセスして確認します.

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary

# headlessモード
option = Options()
option.add_argument('--headless')
driver = webdriver.Chrome(options=option)

# Googleのトップページにアクセスしてbs4でパース
url = "https://google.com"
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

# 出力
ll = filter(lambda x: len(x) > 0, soup.text.split(" "))
for elem in ll:
    print(elem)

最後の出力を確認すると次が得られました.

Google
GoogleについてストアGmail画像ログイン×
削除
不適切な検索候補の報告
お腹がすいた冒険したい遊びたい気分星になった気分Doodle
を探そうトレンディーな気分芸術家気分笑いたい気分
Google
検索は次の言語でもご利用いただけます:
English
日本広告ビジネス
検索の仕組み
プライバシー規約設定検索設定検索オプション検索におけるデータ検索履歴ヘルプを検索フィードバックを送信ダークモード:
オフGoogle
アプリ

参考

https://www.selenium.dev/ja/documentation/webdriver/getting_started/install_drivers/

https://qiita.com/orangain/items/db4594113c04e8801aad

https://qiita.com/orangain/items/6a166a65f5546df72a9d

https://laboradian.com/operate-browser-on-win-by-python-of-wsl-via-selenium/