CentOS7×Chromeでスクレイピング環境を構築するチュートリアル

# 目的
スクレイピングをするための環境をセットアップする。
スクレイピングの実際の実装部分にはほぼ触れません。

いざやろうとすると何度も同じ事を調べていたり、
統一的な情報がまとまってなかったりすることに気づいたので
備忘録として残しておこうと思いました。

特に初心者は、**Chromeのバージョン**と**ChromeDriverのバージョン**の互換性で
予期せぬエラーが出て時間を浪費することがあります。
本記事は、任意のバージョンのChromeをインストールする手順も紹介します。

# 環境
- CentOS 7
- Ruby 2.5.x
- gem selenium-webdriver

# CentOSの起動
Vagrantを使います。
CentOS7のイメージを使って起動してください。
Vagrantについては詳しい記事がたくさんあるのでここでの説明は割愛します。

## 設定を日本にする
Vagrant等の仮想環境はなぜか初期設定がドイツになっていることがあります。

### ▼タイムゾーンを変更
CEST は 中央ヨーロッパ夏時間 のことで+02:00です。

```
$ date
Sun Mar 31 06:13:30 CEST 2019
```

```
$ sudo timedatectl set-timezone Asia/Tokyo
$ date
Sun Mar 31 13:14:23 JST 2019
```

JSTになりました。

### ▼ロケールを変更

現在のロケールを確認。

```
$ locale
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
```

ドイツですね。

`localectl list-locales` で使用できるロケールを探します。

```
$ localectl list-locales | grep -i ja
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
```

`localectl set-locale` で日本語に設定します。
この時点では `locale` で状態を確認しても変わってませんが、
ログインし直すと反映されます。
`localectl` だと変更後の状態をすぐに確認できます。

```
$ sudo localectl set-locale LANG=ja_JP.utf8
$ localectl
System Locale: LANG=ja_JP.utf8
VC Keymap: de
X11 Layout: de
```

### ▼キーマップの変更

これで設定はほぼ終了です。
このままでも普通に問題なく使えるのですが、
クローリングを行うにあたっては、もう一つおまじないが必要です。
キーマップの変更です。

```
$ localectl status
System Locale: LANG=ja_JP.utf8
VC Keymap: de
X11 Layout: de
```

ブラウザでキー入力を行う際に、意図しない文字が入力されてしまのを防ぐために、
キーマップも日本語にしてやる必要があります。

使用できるキーマップの一覧を確認。

```
$ localectl list-keymaps | grep -i jp
jp
jp-OADG109A
jp-dvorak
jp-kana86
jp106
```

とりあえず`jp106`にしておけば問題は起きないはずです。

```
$ sudo localectl set-keymap jp106
```


### 余談
sshで繋いだ時にこんな感じのエラーメッセージが出てることがあります。
ドイツ語なのでわかりにくいですが、「ロケールを変更できません（UTF-8）。そんなロケールこのマシンに入ってないよー。」と言っています。

```
-bash: Warnung: setlocale: LC_CTYPE: Kann nicht die Locale ändern (UTF-8): Datei oder Verzeichnis nicht gefunden
```

これはクライアント側の問題で、iTermなどのターミナルソフトを使っていると、
sshをした時にクライアント側の環境変数を引き継ぐ設定になっていることがあるためです。

iTermでは`Preferences`>`Profiles`>`Terminal`の下の方にある
`Set locale variables automatically` のチェックを外すことで解消できます。
<img width="937" alt=" 2019-04-04 16.57.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/83183/e280c621-85da-4a4c-0c43-ed81112efb9b.png">

# Chromeのインストール
デフォルトのyumリポジトリにはないので追加します。

```
$ sudo vi /etc/yum.repos.d/google-chrome.repo
```

```:/etc/yum.repos.d/google-chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

```
$ sudo yum update
```

最新の安定板をインストールします。

```
$ sudo yum install google-chrome-stable
$ google-chrome --version
Google Chrome 73.0.3683.86
```

2019/04/04現在で、Linuxでは73.0.3683.86が安定バージョンとなります。

# ChromeDriverのインストール
インストールしたChromeのバージョンに合わせるのがポイントです。
マイナーバージョンの違いでも動かなくなることがあるのでなるべく近しいバージョンを探しましょう。
リリースの情報は[ここ](https://sites.google.com/a/chromium.org/chromedriver/downloads)で確認できます。
バージョン一覧は[ここ](https://chromedriver.storage.googleapis.com/index.html)から探せます。

```
$ wget https://chromedriver.storage.googleapis.com/73.0.3683.68/chromedriver_linux64.zip
```

任意のディレクトリにインストール => 解凍 => パスを通します。

```
# コマンドが入っていない場合
$ sudo yum -y install unzip 

$ unzip chromedriver_linux64.zip
$ sudo mv chromedriver /usr/local/bin/
$ sudo chmod 755 /usr/local/bin/chromedriver
$ rm chromedriver_linux64.zip
```

```
$ chromedriver --version
ChromeDriver 73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72)
```

# Rubyのインストール
依存ライブラリをインストール

```
$ sudo yum install -y git openssl-devel readline-devel zlib-devel 
```

rbenvとruby-buildをインストール

```
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$ sudo ~/.rbenv/plugins/ruby-build/install.sh
```

とりあえず2.5.5にします。

```
$ rbenv install 2.5.5
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ rbenv global 2.5.5
```

だん。

# サンプルのプログラムを書く

## スクショを撮る
Qiitaにアクセスしてスクリーンショットを撮るシンプルなプログラムです。
Productionではwaitで書くべきですが、sleepで適当に描画を待ちます。

```ruby:sample.rb
require 'selenium-webdriver'

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
begin
  driver = Selenium::WebDriver.for :chrome, options: options
  driver.get "https://qiita.com/"
  sleep 5
  driver.save_screenshot "#{Time.now.to_i}.png"
ensure
  driver.close unless driver.nil?
  driver.quit unless driver.nil?
end
```

gemをインストールして実行します。

```
$ gem install selenium-webdriver
$ ruby sample.rb
```

以下のようなスクリーンショットが撮れれば**一旦は**成功です。

![1554368305.png](https://qiita-image-store.s3.amazonaws.com/0/83183/60255dd4-1163-bc8d-abc5-9387332925a8.png)

## ローカライズ
見ての通りスクショでは英語のページが表示されています。
これを日本語にしたいので、ブラウザの言語を日本語に設定します。

```ruby:sample.rb
# 以下の1行を追加
options.add_argument("--lang=ja")
```

豆腐になったということはちゃんと言語設定ができている証拠です。
日本語フォントが不足しているのでこういう表示になります。
![1554369049.png](https://qiita-image-store.s3.amazonaws.com/0/83183/a919f7b3-5ada-7a08-be62-8a3165881ab6.png)

## 日本語フォントのインストール
定番はIPAです。

```
$ sudo yum install -y ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
```

![1554369264.png](https://qiita-image-store.s3.amazonaws.com/0/83183/bcc2d9ad-2e04-4711-6f56-541e090f7843.png)

きれい！

# P.S. 任意のバージョンのChromeのインストール
[ここ](http://dist.control.lth.se/public/CentOS-7/x86_64/google.x86_64/Packages/)から任意のバージョンのパスを探してインストールします。

```
$ wget http://dist.control.lth.se/public/CentOS-7/x86_64/google.x86_64/Packages/google-chrome-beta-56.0.2924.59-1.x86_64.rpm
$ sudo yum localinstall google-chrome-beta-56.0.2924.59-1.x86_64.rpm
```

すでに安定版が存在する場合は、削除すると任意のバージョンに差し変わります。

```
$ sudo yum remove google-chrome-stable
$ google-chrome --version
Google Chrome 56.0.2924.59 beta
```

これでChromeのバージョンの変更は完了です。
さて、これで先ほどのプログラムを実行すると、クラッシュします。

```
 unknown error: Chrome failed to start: exited abnormally (Selenium::WebDriver::Error::UnknownError)
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
  (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Linux 3.10.0-229.el7.x86_64 x86_64)
```

表示されるメッセージは様々ですが、原因はChromeDriverとのバージョンの互換性であることがほとんどです。
この手のエラーはググってもなかなか根本的な原因にたどり着かないので、初心者がハマりやすいところです。
ものによっては、「このバージョンなら動く〜」みたいなメッセージが表示されることもあります。


前述の手順に従って、ChromeDriverのバージョンも互換性のあるものに変更しましょう。
互換性は以下のようになっています。

| Chrome       | ChromeDriver |
|:-----------------|:------------------|
|74|74|
|73|73|
|71-73|2.46|
|70-72|2.45|
|69-71|2.44|
|69-71|2.43|
|68-70|2.42|
|67-69|2.41|
|66-68|2.40|
|66-68|2.39|
|65-67|2.38|
|64-66|2.37|
|63-65|2.36|
|62-64|2.35|
|61-63|2.34|
|60-62|2.33|
|57+|2.28|
|54+|2.25|
|53+|2.24|
|51+|2.22|
|44+|2.19|
|42+|2.15|


以上です。
ご査収ください。