EC2上にRails + Selenium + Chromeの実行環境を構築する

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提

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のダウンロード

```bash:ターミナル
#Google Chromeのインストール
curl https://intoli.com/install-google-chrome.sh | bash

# バージョンを確認する
google-chrome --version

# 以下のような表示が出てきたらインストールができていることを確認できる
Google Chrome 115.0.5790.102
```

以上でEC2上での環境構築は完了です。


# Railsプロジェクトのソースコード

## Gemfile

```rb:Gemfile
gem "webdrivers"
```

`gem "webdrivers"`、`gem "selenium-webdriver"`、の2つがあるが、`gem "webdrivers"`のみで動いきました。
以下の記事によると、`webdriversの中に`selenium-webdriver`がインストールされるので、Gemfile内で明示的にインストールが不要とのことです。

https://qiita.com/tk_hamaguchi/items/2201dfbe31d29a968a43


## スクレイピングソースコード

```rb:scraping.rb
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がクラッシュしてしまうことがありました。
エラー文は以下の通りです。

```bash:エラー文
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
```

その際には、以下の記事を参考にして解決しました。

https://sushiringblog.com/chromedriver-error


# 参考文献
https://prograshi.com/language/python/ec2-selenium-scraiping-summary/

https://qiita.com/t0shiya/items/f2f1ce7553af4a07b322

https://sushiringblog.com/chromedriver-error