株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。
AWS EC2上にRails + Selenium + Chromeの実行環境を構築しました。
結構な時間ハマったので、どなたかの参考になれば幸いです。
前提
- AWS EC2 : Amazon Linux 2023 AMI 2023.1.20230719.0 x86_64 HVM kernel-6.1
- このAMIじゃないと、この後実行する行うコマンドでGoogle Chromeがダウンロードできない可能性があるので注意してください。
- Ruby : v3.2.0
- Ruby on Rails : v7.0.5
- bundler : v2.4.12
- Node : v16.20.0
EC2上でRuby on Railsが起動する環境構築はすでに終わっているものとします。
本題に入る前に
環境構築
環境構築する上で大事なことは、Google Chromeのバージョンと、ChromeDriverのバージョンを一致させないと動かないことになります。
Google Chromeの公式では、バージョンを指定してのダウンロードができません。
そのため、Google Chromeをダウンロードしたらバージョンを確認して、ChromeDriverのダウンロードの際にはバージョン指定をする必要がある可能性もあります。
ただし、Webdrivers::Chromedriver.required_version = "114.0.5735.90"
というのを指定したところ、WebDriver内でChromeDriverを自動でインストールして、利用するようになっていました。
以前まではbrew install chromedriver
を実行してChromeDriverをダウンロードして実行していましたが、最新バージョンのWebDriverを利用するとその作業の必要がなくなったということです。 とても便利。
Google Chromeのダウンロード
#Google Chromeのインストール
curl https://intoli.com/install-google-chrome.sh | bash
# バージョンを確認する
google-chrome --version
# 以下のような表示が出てきたらインストールができていることを確認できる
Google Chrome 115.0.5790.102
以上でEC2上での環境構築は完了です。
Railsプロジェクトのソースコード
Gemfile
gem "webdrivers"
gem "webdrivers"
、gem "selenium-webdriver"
、の2つがあるが、gem "webdrivers"
のみで動いきました。
以下の記事によると、webdriversの中に
selenium-webdriver`がインストールされるので、Gemfile内で明示的にインストールが不要とのことです。
スクレイピングソースコード
class Scraping < ApplicationRecord
def self.test
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--window-size=1280x800')
ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
# ここ大事!
Webdrivers::Chromedriver.required_version = "114.0.5735.90"
session = Selenium::WebDriver.for(
:chrome,
options: options
)
session.manage.timeouts.implicit_wait = 10
wait = Selenium::WebDriver::Wait.new(timeout: 180)
session.navigate.to('https://www.google.com/')
session.quit
end
end
その他
Google Chromeがクラッシュしてしまうことがありました。
エラー文は以下の通りです。
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
その際には、以下の記事を参考にして解決しました。
参考文献