#やりたいこと
自身のサイトが「あるキーワード」でGoogle検索した際の自分の順位をLINEに通知させたい。
##環境を作成する
今回は、Windows10 homeで構築します。
仮想環境を作成して必要なライブラリをインストールします。
###仮想環境を作成する
自身のパソコンがライブラリでゴチャゴチャならないように専用の仮想環境を作っておきます。
作り方は下記を参考にしてみてください。
Pythonの仮想環境を作成してみる
仮想環境を作成したらアクティベートしておきます。
Scripts\activate
###ライブラリのインストール
ウェブスクレイピング用のライブラリとherokuで定期実行するためのライブラリをインストールしておきます。
pip install requests
pip install BeautifulSoup4
pip install apscheduler
###LINE連携のためのトークンを発行する
下記にLINEにログインしてアクセストークンを発行します。
通知の際に表示されるトークン名と送信先のトークルームを選択します。
今回は自身に送信するので「1:1でLINE Notifyから通知を受け取る」を選択して発行しました。
発行されたトークンを確実に控えます。(閉じるともう見れません)
##プログラム作成
Pythonファイルを作成します。
コマンドプロンプトで作成するので、パスは作成した仮想環境の場所に移動しておいてください。
type nul > main_proc.py
type nul > clock.py
herokuへのデプロイ後は定期実行するので、スケジュール情報を記載するclock.pyも作成しておきます。
実際のコーディングは下記のとおりです。
本投稿はLINE通知の内容なので、コードの説明は省きます。
import requests
from bs4 import BeautifulSoup as bs
import os
line_notify_token = os.environ['LINE_NOTIFY_TOKEN']
def main_proc():
mes = '圏外もしくは未処理'
targeturl = 'https://sentreseau.com/'
targetur2 = 'http://sentreseau.com/'
#リクエストヘッダー
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
list_keyword = 'power platform 福岡'
url = 'https://www.google.co.jp/search?num=100&q={}'.format(list_keyword)
#接続
response = requests.get(url, headers=headers)
try:
#HTTPステータスコードをチェック
response.raise_for_status()
except:
mes = '今日は取得できませんでした、残念。'
#取得したHTMLをパース
soup = bs(response.content, 'html.parser')
#検索結果のタイトルとリンクを取得
ret_link = soup.select('.r > a')
mes = url
for i in range(len(ret_link)):
#リンクのみを取得し、余計な部分を削除する
url_txt = ret_link[i].get('href').replace('/url?q=','')
if (targeturl in url_txt) or (targetur2 in url_txt):
mes = '「{}」で検索した結果、「{}」順位は{}位でした。'.format(list_keyword, targeturl, i + 1)
break
# LINEに通知
line_notify(mes)
# LINEへの通知関数
def line_notify(message):
line_notify_api = 'https://notify-api.line.me/api/notify'
payload = {'message': message}
headers = {'Authorization': 'Bearer ' + line_notify_token}
requests.post(line_notify_api, data=payload, headers=headers)
if __name__ == "__main__":
main_proc()
import os,main_proc
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
if __name__ == "__main__":
#毎日07:30に実行
sched.add_job(main_proc.main_proc, 'cron', hour=7, minute=30)
sched.start()
#1分毎に実行
#sched.add_job(main_proc.main_proc, 'interval', minutes=1)
##herokuにデプロイします
herokuの作成は下記サイトが参考になります。
http://www.dcom-web.co.jp/technology/heroku1/
###herokuにログインする
下記コマンドを実行するとログインのブラウザが起動するのでログインします。
heroku login
###アプリを作成します
heroku create アプリ名
###buildpackを追加します
herokuでPythonを実行するためにbuildpackを追加します。
※デプロイ時にインストールされる。
heroku buildpacks:add heroku/python -a アプリ名
###タイムゾーンを変更します。
デフォルトはUTCですので、Asia/tokyoにします。
heroku config:add TZ=Asia/Tokyo -a アプリ名
###LINEアクセストークンを環境変数に格納します
コードに直接アクセストークンが書いているのは宜しくないので環境変数に格納しておきます。
heroku config:set LINE_NOTIFY_TOKEN=アクセストークン -a アプリ名
ちゃんとセットされているか下記コマンドで確認してみます。
heroku config -a アプリ名
###herokuで動かすためのファイルを作成します
- requirements.txt
サードパーティのライブラリを記載
下記を実行すれば作成されます。
全て出力されるので、もしかするとherokuのリモートリポジトリにプッシュする際にエラーになるかもしれません。
その場合は、エラーになった部分を削除するなどして対応してください。
pip freeze > requirements.txt
- runtime.txt
Pythonのバージョンを記載
「python -Version」で確認できます。
(ex)python-3.7.4 - Procfile
herokuでWebアプリを動かす指示書のようなものです。
下記のように書きます。
「clock: python clock.py 」
###herokuにデプロイします
(初回のみ)gitの初期ファイルを作成します。
作業フォルダには、「.git」フォルダが作成されます。
git init
(初回のみ)リモートリポジトリを作成します。
heroku git:remote -a アプリ名
変更内容をインデックスに追加します。
git add .
※更新する場合はファイル名を指定します。
git add ファイル名
コミットします。
git commit -m "コメントあれば書く"
herokuにでデプロイします。
git push heroku master
デプロイ後に動作確認してみます。
heroku run python clock.py
ちゃんと動作しています。
どうやら弊社は「power platform 福岡」で検索すると投稿時点では4位みたいですね。
###定期実行を開始します
herokuにデプロイ後に動作確認までは出来たので、定期実行用にコーディングしたclock.pyが定期実行するようにclockを開始します。
heroku ps:scale clock=1
「Scaling dynos... done, now running clock at 1:Free」となればOKです。
これで完了です、毎朝7:30には順位をLINEに通知してくれます。
めでたし、めでたし。
###追伸
ちなみに、herokuで動作中のclockを停止するには下記を実行します。
heroku ps:scale clock=0