[Ruby] seleniumでChromeを使ってWebスクレイピング

## 環境
```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.6
BuildVersion:	17G65

$ ruby -v 
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin17]
```

## 下準備
  - GoogleChromeのインストール
  - chromedriverのダウンロード
  - selenium-webdriver(gem)をインストール

### 1. GoogleChromeのインストール
[GoogleChrome公式](https://www.google.com/intl/ja_ALL/chrome/)

- 最新版のchromeを上記サイトからダウンロード&インストール
- インストールしたアプリを起動(デフォルトブラウザ設定/レポート送信等はお好みで)

### 2. chromedriverのダウンロード/パスを通す

***2-1. ファイルダウンロード***
GUIの場合:
http://chromedriver.storage.googleapis.com/index.html

- LATEST_RELEASEディレクトリに、最新のディレクトリの記載があるので、そのバージョンをダウンロード
- 2.42(10/09時点)
  
CUIの場合:

  ```
  $ curl -O -L http://chromedriver.storage.googleapis.com/2.42/chromedriver_mac64.zip # -> カレントディレクトリ配下にダウンロード
    ※ダウンロードURLはバージョンに合わせてよしなに調べて下さい
  $ unzip chromedriver_mac64.zip
  $ rm chromedriver_mac64.zip
  ```

***2-2. ファイルを移動***

  ```
  $ sudo mv ['解凍したchromedriver'] /usr/local/bin
  ```
  
***2-3. パスを通す***

  ```
  $ export PATH="/usr/local/bin:$PATH"
  ```

***2-4. 確認***

  ```
  $ which chromedriver
  --> /usr/local/bin/chromedriver
  ```
  
### 3. selenium-webdriver(gem)をインストール

***3-1. selenium-webdriverインストール***

- Gemファイルを使う場合

```
gem 'selenium-webdriver' # この記載を追加
$ bundle install
```

- 直接インストールする場合

```
$ gem install selenium-webdriver
```
  
***3-2. 確認***

```
$ gem list | grep selenium-webdriver
-> selenium-webdriver (3.12.0) ※特定のバージョンが良い場合はよしなに指定
```

## コード

```ruby:
require 'selenium-webdriver'

@wait_time = 3 
@timeout = 4

# Seleniumの初期化
# class ref: https://www.rubydoc.info/gems/selenium-webdriver/Selenium/WebDriver/Chrome
Selenium::WebDriver.logger.output = File.join("./", "selenium.log")
Selenium::WebDriver.logger.level = :warn
driver = Selenium::WebDriver.for :chrome
driver.manage.timeouts.implicit_wait = @timeout
wait = Selenium::WebDriver::Wait.new(timeout: @wait_time)

# Yahooを開く
driver.get('https://www.yahoo.co.jp/')

# ちゃんと開けているか確認するため、sleepを入れる
sleep 2

#**
  # ブラウザでさせたい動作を記載する
  
  # ex. 検索欄に'Ruby'と入力して、検索ボタンを押す処理
  
  # 検索欄/検索ボタン取得
  begin
    search_box = driver.find_element(:id, 'srchtxt') # 検索欄
    search_btn = driver.find_element(:id, 'srchbtn') # 検索ボタン
  rescue Selenium::WebDriver::Error::NoSuchElementError
    p 'no such element error!!'
    return
  end
  
  # 入力欄に'Ruby'を入力し、検索ボタンを押下
  search_box.send_keys 'Ruby'
  search_btn.click
#**

# ドライバーを閉じる
driver.quit
```

![スクリーンショット 2018-10-09 12.29.57.png](https://qiita-image-store.s3.amazonaws.com/0/117388/b4abd93a-075c-46f9-467f-c1e7e960cc33.png)

![スクリーンショット 2018-10-09 12.43.59.png](https://qiita-image-store.s3.amazonaws.com/0/117388/344414fc-9faf-f26d-4c99-d23c357bcdd8.png)



## 注意点

- ネットワークが遅い場合等は@wait.until{}を使って要素が取得出来るまで待ってあげると良いです。
-> http://katsulog.tech/i-do-not-recommend-using-sleep-when-waiting-for-elements/

- ログについては、私は別途Loggerオブジェクトを生成してロギングするメソッドを作って、それを呼び出してます。

```ruby

log_file = File.join('./', "function.log")
@log = Logger.new(log_file)

def log(msg)
  @log.debug(msg)
end
```

## 参考

[ドライバーでの処理について(操作方法をまとめてくれてます)](https://morizyun.github.io/web/selenium-cheat-sheet.html)

## まとめ
仕事でよく使う機会があるので、備忘も兼ねて書きました。
覚えてしまえば、簡単にスクレイピング出来るので重宝しています。
cronとDBを組み合わせれば、データを定期的に取ってきて保存しておいて、機械学習なんかにも使えるので便利ですね。