iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0
影片教學

用Django架構建置專屬的LINEBOT吧系列 第 25

[Day 25]用Django架構建置專屬的LINEBOT吧 - 網路爬蟲(II)LINE Notify+Heroku Scheduler

上兩篇分別講述了關於如何爬取網路資料以及如何獲得Notify Access Token
今天就來介紹如何將兩者結合囉~

利用Heroku建立定時爬取資料的應用

這邊介紹一個建議的使用方法來讓爬蟲可以定時自動運作,
就是將python的爬蟲執行檔丟到Heroku上面,並且設定固定時間執行,

Heroku是一個支援多種程式語言的雲平台即服務(PaaS),
提供了Ruby、Java、Node.js、Scala、Clojure、Python以及PHP和Perl程式語言伺服器環境的支援,
也有提供免費的伺服器空間,對於開發者而言是非常方便的一個選擇,

使用方法上,首先在官網先註冊一個帳號
註冊的過程就不贅述了,依照步驟填下去就行了,
不過密碼的部分會要求設定較高強度的,

完成註冊之後,登入帳號會看到類似的畫面,
不過第一次登入時,下面會是空白的,

https://ithelp.ithome.com.tw/upload/images/20201009/2012117672OoSMComj.jpg

在右上角的New可以點選"create new app"新增一個APP服務空間,
名字設定一個可用的,地區選擇美國,按下"create app"即可新增完畢,

https://ithelp.ithome.com.tw/upload/images/20201009/20121176myzXoema0r.jpg

完成新增APP之後,
要將爬蟲程式碼透過git遠端部屬到Heroku上面,
因此要再下載GIT及Heroku CLI,
詳細方法可參閱第一篇的影片

網路爬蟲+Notify實作

在把程式碼推上Heroku定時執行之前,
先用本機的程式進行一次成功的操作,

比照之前的實作範例,我們先做一個爬蟲執行雷達回波圖的爬取,
再讓這個圖片跟文字透過Notify的通知訊息回傳到user端,

首先,建立好爬取雷達回波圖的爬蟲程式:

#Radar_Echo.py

import requests 
def weather_pridict():
    url = 'https://opendata.cwb.gov.tw/fileapi/v1/opendataapi/O-A0058-003?Authorization=rdec-key-123-45678-011121314&format=JSON'
    res_get = requests.get(url)
    radar_echo = res_get.json()

    image_url = radar_echo['cwbopendata']['dataset']['resource']['uri']

    post_url='https://4a0222640c48.ngrok.io/Weather_Predict'
    res_post = requests.post(post_url,image_url)

weather_pridict()

上述程式碼是在Day 23使用過的,
但只有擷取雷達回波圖的URL,
沒有進行位置與圖片顏色的判別,
而其中的post_url是要將圖片URL傳送的指定位址,

接下來,我們要在views.py先建立一個接收雷達回波圖專用的函數:

#views.py

@csrf_exempt
def Weather_Predict(request):
    #將接收到的request以utf-8編碼讀取,並且令為body
    body = request.body.decode('utf-8')
    print(body)

    text='雷達回波圖'

    token = '放入你要傳送的notify token'

    headers = {
        "Authorization": "Bearer " + token, 
        "Content-Type" : "application/x-www-form-urlencoded"
    }
    notify_url = "https://notify-api.line.me/api/notify"
    #payload中的message是文字訊息,imageThumbnail是縮圖網址,imageFullsize則是完整圖片網址
    payload = {'message': text,'imageThumbnail':body,'imageFullsize':body}
    r = requests.post(notify_url, headers = headers, params = payload)
    return HttpResponse()

裡面有先將接收到的雷達回波圖網址解析出來=>body的部分
並且以payload設定Notify要傳送的訊息內容,包含text與body(雷達回波圖URL),
token可以是指定的,上一篇有提到如何將token放入資料庫,
因此這邊可以從資料庫中將指定User的token調出來,
token要放到headers當中,並以"Authorization": "Bearer " + token格式
在以POST的方式把訊息傳給notify_url,

上面兩個設定完成之後,
在將Weather_Predict URL及函數添加到urls.py檔案中:

from django.contrib import admin
from django.urls import path
from django.conf.urls.static import static
from django.conf.urls import url
from django.conf import settings

from IT_help import views

urlpatterns = [
    path('admin/', admin.site.urls),
    url('^callback',views.callback),
    url('^notify',views.notify),
    url('^Weather_Predict',views.Weather_Predict),
]

#加入這一行
urlpatterns+=static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

接著執行一次爬蟲程式看看成果,
如果順利執行的話,User端應該收到來自Notify的一對一訊息,
其中包括文字與圖片內容,結果圖如下:

https://ithelp.ithome.com.tw/upload/images/20201009/20121176om9w8UQ5OJ.jpg

這樣就代表一次的執行就能獲得一次雷達回波圖的提醒通知囉

實際操作影片:
Yes

以Heroku Scheduler定時執行爬蟲程式

接下來介紹將爬蟲程式部屬到heroku上面定時執行的辦法,
首先要建立一個專用的資料夾,並且建立requirements.txt檔案,
將爬蟲程式會用到的套件名稱都寫入這個檔案,以便讓heroku進行套件安裝,

以上面那個爬蟲程式為例,只需要安裝requests套件即可:

#requirements.txt

requests

接下來依序輸入以下指令進行部屬:

#登入heroku
$ heroku login

#建立git初始化資料夾
$ git init

#指定遠端操作的APP
$ heroku git:remote -a app名稱

接著就是透過下列指令將檔案上傳至heroku的master,

#將資料夾檔案部屬至heroku
$ git add .
$ git commit -am'notify'
$ git push heroku master

完成部屬會看到以下畫面:
https://ithelp.ithome.com.tw/upload/images/20201009/20121176af1FelI1Dy.jpg

部屬完成後,再輸入以下指令,
進入heroku遠端操作並且確認上傳的檔案結構,

$ heroku run bash

#進入heroku指令端,查看app底下的檔案內容
$ ls
>>Radar_Echo.py  requirements.txt  runtime.txt

#測試在heroku上執行python程式
$ python Radar_echo.py

如果能夠在heroku上執行並且順利在Notiify接收到雷達回波圖,
則代表heroku的執行環境是沒問題的,

接下來再到Heroku APP的管理頁面當中,
點選上面的Resources,並在Add-ons中搜尋Heroku Scheduler,
由於Add-ons功能會需要新增信用卡資訊才使用,所以可能會需要設定信用卡資訊,
不過heroku每個月會有1000 hour的扣打可以用,對小型文本使用上還是堪用的,

https://ithelp.ithome.com.tw/upload/images/20201009/20121176zVGBm4jbZH.jpg

安裝Heroku Scheduler:

https://ithelp.ithome.com.tw/upload/images/20201009/201211764W7pdr9uZO.jpg

接下來點選Heroku Scheduler,進行管理設定,
點選Create job以新增一個定時任務排程,

首先設定執行的時間間隔(三種預設的時間,每十分鐘,每小時,每天),
再設定執行的指令,就是剛剛在heroku run bash中測試的指令,
按下Save Job,就完成定時爬蟲的設定囉!不過實際測試需要等待十分鐘的時間。

https://ithelp.ithome.com.tw/upload/images/20201009/20121176oRKuPIOLMi.jpg

額度的部分可以透過輸入以下指令查詢目前所剩下的免費額度還有多少,
會以百分比來呈現,

heroku ps -a app名稱

這邊簡單展示一下heroku的定時執行功能,
當然如果是執行量較大的話,就另當別論囉~

實際操作影片:
Yes


上一篇
[Day 24]用Django架構建置專屬的LINEBOT吧 - LINE Notify
下一篇
[Day 26]用Django架構建置專屬的LINEBOT吧 - 網路爬蟲(III)位置訊息應用
系列文
用Django架構建置專屬的LINEBOT吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言