ブラウザ上の操作をRaspberry Piを使って自動化する方法

# はじめに

ブラウザ上の定期的に行う処理や繰り返し行う処理を自動でやりたいというモチベーションのもと、それをRaspberry Piにやってもらうというのがこの記事の目的です。要素技術としては、以下の2点です。

- selenium + chromedriverのRaspberry Pi上での使い方
- cronの設定

この記事はRaspberry PiをセットアップしてSSH接続し、Python環境ができていることを前提としています。Raspberry Piを一から用意する場合は、[ゼロからはじめるRaspberry Pi [OSの書き込み/SSH接続]](https://note.mu/seishin55/n/n1032b20eca67)を見ながら進めて下さい。

# 環境

- LEMORE Raspberry pi 3 model b+ Starter Kit
- OS: raspbian (kernel version 4.14)
- Python 3.6.8 (pyenvによる)

# chrome driverの用意

ブラウザ上の自動実行を行うには`selenium`が便利です。Pythonからも利用できます。`selenium`では通常、実行するとブラウザが起動され勝手にブラウザが操作されますが、headlessバージョンで使用すると、ブラウザを起動せずに利用できます。今回はこのheadlessバージョンを使用します。また、`selenium`の利用に際してdriverが必要なのですが、chromeのドライバーを使用します。

以下のページから各OS(Mac, Windows, Linux)に対応したdriverを取得できます。

https://sites.google.com/a/chromium.org/chromedriver/

しかし、今回のraspbianの場合、Linux版でも実行できませんでした。Chromiumドライバを使えば対応可能とのことでこちらを使います。（Mac, Windows, Linuxなら上のURLからdriverをもってくればOKです。）

https://launchpad.net/~canonical-chromium-builds/+archive/ubuntu/stage/+build/14482955

`chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb`をダウンロードしてきます。


```
$ https://launchpad.net/~canonical-chromium-builds/+archive/ubuntu/stage/+build/14482955/+files/chromium-codecs-ffmpeg-extra_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb
$ sudo dpkg -i chromium-codecs-ffmpeg-extra_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb
$ ls /usr/lib/chromium-browser/chromedriver # 確認
```

これでchrome driverの用意は完了です。

# seleniumの実行コード

次に、seleniumで自動でブラウザ処理を実行するコードを書きます。以下のコードがテンプレートです。「処理」と書かれたところに実行する内容を記述します。`save_screenshot`によってエラーが出た場合はスクリーンショットを残してくれます。

```python
# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')

driver = webdriver.Chrome(executable_path="/usr/lib/chromium-browser/chromedriver", chrome_options=options)
driver.get(url)

try:
    # 処理
except Exception as e:
    print(e)
    driver.save_screenshot('screenshot.png')

driver.close()
```

処理の書き方については本記事では扱いませんが、[Python + Selenium で Chrome の自動操作を一通り](https://qiita.com/memakura/items/20a02161fa7e18d8a693)を参考にする等調べてみて下さい。

seleniumがない場合はインストールして下さい。

```
$ pip install selenium
```

# cronの設定

raspbian OS上でcronの設定を行い、上記の実行ファイルを定期実行させます。

## cronのファイルの用意

まず、cronのテンプレートをコピーします。コピーしたファイルの自分で設定したい内容を記述します。

```
$ cp /etc/crontab /etc/cron.d/mycron
```

## cronの設定

コピーしたファイルを以下のように書き換えます。今回はpyenvを使っているので、pyenvのパスを通す処理を実行の前に加えています。また、`> [path/to/your_log_file] 2>&1`という記述によって、標準出力とエラーのログを指定したファイルに出力しています。cronの時間の設定は[cronの設定方法](https://qiita.com/hikouki/items/e744b3a4d356d2af12cf)等を参考にしてみて下さい。以下の例は毎日1時に定期実行です。

```sh:/etc/cron.d/mycron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user^ command
0 1    * * *  pi   PYENV_ROOT=~/.pyenv;export PATH=$PATH:$PYENV_ROOT/bin;eval "$(pyenv init -)";eval "$(pyenv init -)";eval "$(pyenv virtualenv-init -)";python [path/to/your_execution_file] > [path/to/your_log_file] 2>&1
```

## cronの設定の反映

ファイルの設定ができたら、以下のコマンドでcronの変更を反映させます。

```
$ sudo service cron restart
```

以上で、定期実行の設定も完了です。

# 参考

- [Raspberry Piによるスクレイピング 環境構築（Selenium + Chromiumドライバ）](https://qiita.com/Brutus/items/7381a13fa395f9b73855)
- [Cronの使い方とテクニックと詰まったところ](https://qiita.com/UNILORN/items/a1a3f62409cdb4256219)
- [pythonスクリプトをcronで自動実行したいときに気をつけること](https://blog.kyabe.net/2016/10/python-cron.html)
- [cronがうまく動かないときの調査](https://qiita.com/kkoito/items/28d9a453c425b08738d2)