Herokuを使ってスクレイピングした情報をLINE Notifyで通知する
スクレイピングした情報をLINE Notifyで通知するスクリプトは完成したので、
今回はこれを定期実行するためにHerokuにデプロイしたいと思います。
Heroku
HerokuとGitの使い方はここでは省略しますが、Herokuのアカウントを持ってない場合は作って
Heroku CLIをダウンロード。
Herokuにデプロイするまでに準備するもの
- jra.py スクリプト実行ファイル
- index.py
- Procfile
- requirements.txt
- runtime.txt
requirement.txt
必要なライブラリをここに記入。最初にデプロイするときにpipからインストールしてくれます。
beautifulsoup4==4.6.3
requests==2.20.1
bottle==0.12.15
仮想環境でライブラリをインストールしているならpip freeze > requirements.txt
でも可。
Procfile
Herokuで実行するファイルをここに記述。ファイル名はProcfileのみで拡張子はなし。
web: python index.py
index.py
index.pyというダミーファイルを置きます。そうしないとアプリを起動しただけ(デプロイしただけ?)でスクリプトを実行してしまい、Line Notifyに複数回同じ内容の通知が届いてしまいます。
index.pyはフレームワークbottleを使用
import os
from bottle import route, run
@route("/")
def hello():
return "Hello"
run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
runtime.txt
使用するpythonのバージョンを記述
python-3.6.5
実行ファイルを本番用に変更
いままではアクセストークンをそのまま記述していましたが、セキュリティを考えて環境変数を設定する形にします。 環境変数の設定は後述。
import requests
import re
from bs4 import BeautifulSoup
import datetime
import os #osモジュールで環境変数を読み込む
TOKEN = os.environ["TOKEN"] #環境変数"TOKEN"を取得
def line(mes,TOKEN): #<------
url = "https://notify-api.line.me/api/notify"
token = TOKEN #アクセストークンはここに記述しない
headers = {"Authorization": "Bearer " + token}
message = '\n' + mes
payload = {"message": message}
requests.post(url, headers=headers, params=payload)
def main():
today = datetime.datetime.today().strftime("%m/%d")
headers = {'User-Agent': 'Mozilla/5.0'}
res = requests.get('https://world.jra-van.jp/news/', headers=headers)
soup = BeautifulSoup(res.content, "html.parser")
for news in soup.find_all("div", id="news-area"):
for a in news.find_all("a"):
link = a.get("href")
if a.find_all(text=re.compile(today)):
for title in a.find_all("p", class_="inline-item text-title photo"):
texts = 'https://world.jra-van.jp'+link, title.get_text()
text = "\n".join(texts)
line(text,TOKEN) #<-------
if __name__ == '__main__':
main()
コメント部分が前回のコードから変更したところ。
Herokuにデプロイ
Herokuにアプリを作成してデプロイします。
僕はHerokuのダッシュボードからcreate new app
で新しいアプリを作成した(してしまった)ので、
heroku login
git init
heroku git:remote -a アプリ名
で新しいGitのレポジトリを作成。
その後は
git add .
git commit -m "First commit"
git push heroku master
でデプロイ。デプロイの仕方はダッシュボードのDeployタブで確認・編集できます。
トークンを環境変数に設定
heroku config:set TOKEN="アクセストークンをここに"
HerokuのsettingページのConfig Varsで設定した環境変数を確認することができます。
Heroku Scheduler
Herokuで定期的にappを実行するにはスケジューラーが必要なのでHeroku Schedulerのアドオンを使用。
アドオンを追加するコマンドは
heroku addons:create scheduler:standard
なお、アドオンを使用する場合は無料利用でもクレジットカード、もしくはデビットカード情報を入力しなければならないので注意。
クレカ情報を登録したくないならAPSchedulerというライブラリを使用すると良いみたいです。
Herokuのダッシュボードにアクセスすると
Heroku Schedulerが追加されているのでconfigure add onsをクリックしてスケジューラーの設定をする。
$に実行するファイルを設定して、時間の部分はUTCなので実行したい時間にマイナス9時間した時刻を設定。
今回は16:00に実行したいので07:00にする。
結果
16:00に実行されました。