スクレイピングをcronで定期的に実行

## やりたいこと
- 【[こちらから](https://qiita.com/kawagoe6884/items/940d87d9a0b7d919f1dd)】無料枠でGCEを起動したい
- 【[こちらから](https://qiita.com/kawagoe6884/items/940d87d9a0b7d919f1dd)】SSHの22番ポートを3333番ポートに変更したい
- 【[こちらから](https://qiita.com/kawagoe6884/items/709826bcb1d84957e88f)】GCE(仮想マシン) 内の Python(Ubuntu) でSeleniumを使ったスクレイピング
- 【[こちらから](https://qiita.com/kawagoe6884/items/709826bcb1d84957e88f)】取得したファイルをGoogle Driveにアップロード
- 【このページ】スクレイピングを cron で定期的に実行する
- 【このページ】指定の時間にインスタンスをオン/オフする


## 全体図
![cloud.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/6c42035e-15d4-66d7-537c-b8edad69f16e.jpeg)


## 1ヵ月周期でスクレイピングをする設定
接続先で cron の設定をするコマンドを入力
```shell:hogehoge@vm-hoge:~$
crontab -e
```
crontab の実行が初めての場合はエディタを選択するように言われる
```Select an editor.  To change later, run 'select-editor'.```

ここでは **vim.basic** を選択する

次に、毎月 1日の 0:00に **qiita.py** を実行する設定を追加する
```0 0 1 * * python3 /home/hogehoge/scrape/qiita.py```
```shell:crontab ファイル内
# Edit this file to introduce tasks to be run by cron.
# 
~ 省略
~ 省略
~ 省略
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
0 0 1 * * python3 /home/hogehoge/scrape/qiita.py
```
保存したらこれで cron の設定おわり。簡単。


### typoしてcronの設定消えちゃった...！
とならないように、```crontab -r``` の対策
```shell:hogehoge@vm-hoge:~$
vim ~/.bashrc
```
以下の1行を追加して保存
```shell:~/.bashrc
alias crontab="crontab -i"
```
編集した内容を反映する
```shell:hogehoge@vm-hoge:~$
source ~/.bashrc
```
間違えて ```crontab -r``` と入力しても「本当に消すのか？」と確認してくれる
```shell:hogehoge@vm-hoge:~$
crontab -r
# crontab: really delete hogehoge's crontab? (y/n)
```


### 日付変わったら動くように設定したのに朝の9時に動いた！
とならないように、タイムゾーンの設定を変更
```shell:hogehoge@vm-hoge:~$
timedatectl set-timezone Asia/Tokyo
sudo systemctl restart cron
```



## VM インスタンスを自動で起動・停止をする設定
- VM インスタンスが作成済みであることを想定して話を進めます

もう少しマシンパワーが欲しいとき、無料枠を超えたつよつよマシンで動かすと思うのですが
料金体系が従量課金制なので動かしてない間もお金がかかります。
簡単に言うと、誰も見てないテレビがつけっぱだとお金がかかるので自動でオンオフしよう的な。

インスタンスが止まってしまえば不正アクセス等も出来ないはずなので、無料枠だけの運用しかしない場合も設定する価値はあると思います


### ① VM インスタンスにタグを追加する
1. 画面左上、Google Cloud ロゴの左にある **ナビゲーション メニュー** から **すべてのプロダクトを表示**
![**ナビゲーション メニュー**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/905ec8b6-5113-79f1-4da7-1335f4100d0e.jpeg)
![**すべてのプロダクトを表示**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/5f5caefb-2f98-b89f-8dd7-f97d2c8f92b6.jpeg)
1. コンピューティングの **Compute Engine** を選択
![**Compute Engine**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/e7102602-e87b-fced-0fdc-e6c2d556823e.jpeg)
1. **インスタンス名** をクリック
![**インスタンス名**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/a25fd260-a189-2cbb-b6fb-73642883ef73.jpeg)
1. **編集** をクリック
![**編集**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/9f20b109-185e-4945-d6fe-41e07aab7020.jpeg)
1. **ラベルの追加** をクリック
![**ラベルの追加**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/e6152267-274a-8daf-3093-5e1ac7b9560c.jpeg)
1. **キー：**```env```　**値**```dev```　と入力
![**キーと値**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/74093b94-9a91-2a70-147a-2007573b6a48.jpeg)
1. 画面右下の**SAVE**、画面左下の**保存する** をクリック


### ② Cloud Scheduler と Cloud Functions の設定
https://cloud.google.com/scheduler/docs/start-and-stop-compute-engine-instances-on-a-schedule#deploy_functions_triggered_by_through

上記ガイドの ```Cloud Functions を介して Pub/Sub によってトリガーされる関数をデプロイする``` から ```クリーンアップ``` 手前までを進めていけば設定できます


## メモ
- [VM インスタンスを自動で起動・停止をする設定](https://qiita.com/kawagoe6884/items/944424e553eab9159b98/#vm-%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E8%87%AA%E5%8B%95%E3%81%A7%E8%B5%B7%E5%8B%95%E5%81%9C%E6%AD%A2%E3%82%92%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A)
  これに関して、```インスタンス スケジュール``` という別機能でも同じようなことができるが融通が利かない
  例えば、時間・曜日を変更したいときに１から作り直しが必要
- cron の設定でファイルのパスを絶対パスにしないとエラーが発生する


## 参考先
https://qiita.com/Moh_no/items/e8902ec40df7ddf9448a

https://qiita.com/houtarou/items/cad584e7d10adf22e417