Python + Selenium + Cron で Chrome の自動操作を定期的に行う

日々行う単純作業を自動で行いたくなったので色々調べた。
MacOSではcronではなくてlaunchdを使うことが推薦されているらしいが、なぜかうまく行かなかったので今回は慣れているcronで定期実行させることにした。下記に環境設定から実行までの一通りを記録しておく。

# 実行環境・バージョン

| ソフト | バージョン |
|:-----------:|:------------:|
| Mac | MacOS Mojave(10.14.4) |
| Python | 3.6.0 |
| Chrome | 74.0.3729.131 |
| Selenium | 3.141.0 |

# Pythonのバージョン更新
macではpythonがデフォルトで入っているけが、バージョンが2系で古いので3系をダウンロードして切り替える。

```
$ python --version
python 2.7.10　　

$ which python
/usr/bin/python　#この絶対パスがあとでpythonのバージョンが変わると変わる  

# Mojaveでは次のコマンドを先に実行しないとバージョンがうまく切り替わらない
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /  

$ xcode-select --install  

$ brew install pyenv　　

$ pyenv install 3.6.0  

$ pyenv global 3.6.1

$ which python
/Users/***/.pyenv/shims/python
```
python3.6をダウンロードしてもうまく切り替わらなかったが、xcode-selectの最新バージョン(2354)にMojave用のmacOS SDK headerがデフォルトで入っていないのが原因らしいので次のコマンドで一応解決。
`$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target / `
下記のサイトが参考になった。
https://qiita.com/okhrn/items/935cf187aec5cf144558
http://nayuho.hatenablog.jp/entry/2018/06/29/160440
https://qiita.com/zreactor/items/c3fd04417e0d61af0afe
↑これで解決

# そのほか必要なものインストール

```
# pipを先にインストールしてから
$ pip install selenium
$ brew install chromedriver
```
pipはpythonのパッケージ管理ツールなんだね〜
へぇ〜PHPのComposerみたいなもんかな
あとcomposerのようにダウンロードしたパッケージは現在いる場所のvendorみたいなところに入るのではなくて、どっかのパスが通っているところに入るのが意外だった！（まだpythonに慣れていないので;;）

# pythonを書く
seleniumの書き方はググればいっぱい情報が出てくるので、それを参照すれば良いと思う。googleで検索する簡単なサンプルは下記。

```python
import time
from selenium import webdriver

# ブラウザを開く。
driver = webdriver.Chrome('/usr/local/bin/chromedriver')
# Googleの検索TOP画面を開く。
driver.get("https://www.google.co.jp/")
# 検索語として「selenium」と入力し、Enterキーを押す。
driver.find_element_by_id("lst-ib").send_keys("selenium")
driver.find_element_by_id("lst-ib").send_keys(Keys.ENTER)
# タイトルに「Selenium - Web Browser Automation」と一致するリンクをクリックする。
driver.find_element_by_link_text("Selenium - Web Browser Automation").click()
# 5秒間待機してみる。
sleep(5)
# ブラウザを終了する。
driver.close()
```
https://qiita.com/y__ueda/items/7b6f2a95ea45667e1029
http://www.seleniumqref.com/api/webdriver_gyaku.html
注意すべき点はchromedriverのパスもちゃんと記入すること。
記入しなくてもpythonコマンドで手動で動かすには問題ないが、cronだとダメっぽい。

# cronで定期実行させる

```
$ crontab -e  

# 実行する命令を書く。私の場合は下記。
2 2 * * * /Users/***/.pyenv/shims/python /Users/***/Desktop/test.py
```
これでうまく行く！
ここで注意しなければいけないのはcronの中ではパスが通っていないこと！コマンドのパスも、実行するファイルのパスも絶対パスで書かなければいけないこと！

# スリープ状態ではcronが起動しない！
うまく行くと思いきやそもそもmacってスリープ状態ではcronが動いてくれないんだ。多分、、、
なのでcronの設定時刻あたりにmacをスリープ解除するように設定する

システム環境設定>省エネルギー>スケジュール
起動またはスリープ解除を設定する
<img width="664" alt="スクリーンショット 2019-10-12 23.24.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413679/edf23f2c-bffb-d554-43a4-c74344fe0951.png">


# 最後に
ただのスクレイピングだけを行うならPHPだけでいいと思うんだが、今回はやりたいサイトにログインしたりポップアップとか消したかったので色々試した結果上記の過程を選んだ。
seleniumでいけるサイトもあるが、アクセスしてサブウィンドウを消してから次の工程に入らないといけない場合はどう対処していいかはまだわからない。これに関してはseleniumに慣れながら解決策があるかどうか探して見ようと思う。

# 変更点
#### 2019-08-21
１週間前くらいから起動していなかったことを知り調べてみた結果どうやらchromeがupdateされてchromedriverとバージョンが合わなくなったみたいだ。
https://sites.google.com/a/chromium.org/chromedriver/downloads
上記のサイトからchromeバージョンに合うdriverを設置してパスに入れたらうまく動作した。
パスは繰り返しになるが下記

```
/usr/local/bin/chromedriver
```
#### 2020-01-22
Catalinaにアップデートしてからなぜかcronがまったく動作しなくなって調べたが、以下の設定をしないといけないらしい。

「システム環境設定」＞「セキュリティとプライバシー」＞「フルディスクアクセス」
<img width="668" alt="スクリーンショット 2020-01-18 14.56.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413679/aca00b16-d1e3-77d1-0d0b-944ab50fef20.png">

ここで以下のファイルを追加する
/usr/sbin/cron
試したがこれで動いた！
https://newsbeezer.com/franceeng/macos-catalina-can-block-some-unix-programs-by-default/
https://mac-ra.com/catalina-crontab/