WSL 上の Ruby から Selenium WebDriver を利用して Google Chrome を自動実行し、スクレイピングする必要がでてきた。
同様の処理は以前も書いた事があったのだが、WSL や Ruby のバージョンも上がり以前の処理そのままでは動かなくなってしまったため、新たに環境構築を行い実行することにした。
WSL のアップデート
WSL はすでにインストールしていたので導入方法に関しては省略する。
WSL では WSLg を利用することで GUI のアプリを利用できる。そのため、Chrome を Headless ではなく通常の GUI 付きで実行可能だ。
WSLg は標準で有効になっているはずなので、何も考えずに GUI アプリを利用できる。WSL で GUI が使えるかどうかは gedit や xeyes などの適当な GUI アプリを実行してみよう。
$ sudo apt install x11-apps
$ xeyes
その際「Error: Can't open display: 0」などと出る場合には WSL を更新すると直る可能性がある。
PowerShell を管理者権限で実行し、以下のコマンドを実行して wsl のアップデートと再起動を行う。
wsl --update
wsl --shutdown
その後 wsl を実行すると GUI アプリが使えると思う。
Google Chrome インストール
WSLg が動いたら Google Chrome をインストールする。Google Chrome をインストールするにはリポジトリを追加しなければいけないようだ。
$ sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.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 コマンドを実行すると GUI で Chrome が実行される。
日本語フォントをインストールする
そのままでは日本語が文字化けを起こすので、日本語のフォントをインストールする。
$ sudo apt install language-pack-ja
$ sudo apt install fonts-ipafont
$ sudo apt install fonts-ipaexfont
$ fc-cache -fv
これで再度 Google Chrome を起動すれば Web ページ内の日本語が正常に表示されると思う。ちなみに Chrome のウインドウのタイトルは文字化けしたままだが今回は使わないのでほうっておく。
Webdriver インストール
Google Chrome を Selenium から動かすには WebDriver と呼ばれるソフトウェアが必要となる。
ChromeDriver - WebDriver for Chrome - DownloadsChromeDriver のページよりインストールした Chrome のバージョンにあうものをダウンロードする。
$ google-chrome --version
Google Chrome 114.0.5735.198
$ wget https://chromedriver.storage.googleapis.com/114.0.5735.90/chromedriver_linux64.zip
$ unzip chromedriver_linux64.zip
$ mv chromedriver bin/.
chromedriver は PATH が通っている適当な位置においておく。
Ruby から Selenium を利用する
ruby から Chrome を自動実行するには selenium-webdriver を利用する。
$ gem install selenium-webdriver
インストールしたら ruby でコードを書く。
require 'selenium-webdriver'
options = Selenium::WebDriver::Chrome::Options.new
# options.add_argument('--headless')
options.add_argument('--incognito')
options.add_argument('--window-size=1280,800')
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
@driver = Selenium::WebDriver.for :chrome, options:options
@driver.navigate.to 'https://loumo.jp/'
実行すると Chrome が起動するが、このように「Chrome is being controlled by automated test software」と表示される。
もし GUI 無しの Headless で実行する場合は、--headless オプションを追加してやる。