Python Django 實作(三) 用 abscheduler 在 Heroku 後台執行定時爬蟲程式
在 遊戲資訊系統 專案中,爬蟲寫在前台頁面的連結,待使用者點擊後執行
這對於使用者的體驗並不良好,所以最好的辦法就是讓爬蟲程式在後台定期運行,
間隔一段時間就會定期爬蟲一次,並將資料儲存到資料庫
流程、
分為五個部分:
- 安裝 abscheduler
- 從 views.py 分離爬蟲程式
- 設置 clock.py
- Heroku 相關文件修改
- 使用 git 進行更新
1.安裝 abscheduler:
首先啟動虛擬環境,切換目錄到該專案中,使用 pip 安裝 abschedule
安裝好後使用以下代碼對requirements.txt 進行更新,讓 Heroku 也安裝此套件:
pip freeze > requirements.txt
2.從 views.py 分離爬蟲程式:
原先將爬蟲程式寫在 views.py 當中,
接著要將爬蟲程式獨立出來,並使用 abscheduler 來讓爬蟲定期運行
獨立出來的程式要放在專案的根目錄中(若放在APP中,啟動伺服器的時候會不斷執行定期爬蟲)
這裡我命名為 <crawler1.py>
由於爬蟲後要儲存到資料庫,而專案根目錄又不在Django內部
因此需要在開頭加入一些才能代碼才能從外部調用 Django的 ORM:
#外部調用django models import django import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pjname.settings") #pjname請改為你的專案目錄名稱 from django.conf import settings django.setup() from yourapp.models import hello #此行為導入 models 中的 hello 資料表
接著 import 完所有需要用到的套件後
後面就可以寫入爬蟲程式
包含會呼叫到的自訂函式與連接資料庫的函式都要一起放進來
最後在文件的末端直接執行爬蟲程式,以下為範例:
def crawler2(): # 爬蟲程式 global 變數 '''爬蟲程式內容''' sql() # 將爬出的內容進行與資料庫的連接 def sql(): global 變數 '''連接資料庫''' crawler2()
3. 設置 clock.py:
接著要使用 abscheduler 來進行定期執行py文件的任務
(1)建立 <clock.py> 檔案
此檔案放在專案根目錄,用來調用<crawler1.py>
import os from apscheduler.schedulers.blocking import BlockingScheduler sched = BlockingScheduler() @sched.scheduled_job('interval', minutes=3) #定期執行,每三分鐘執行一次 def cr(): print('do crawler') #運行時打印出此行訊息 os.system("python crawler1.py") #開啟 crawler1.py sched.start()
(2)修改 <Procfile>
要新增一個 dynos 來執行 clock.py
請在 <Procfile> 文件加入以下代碼:
clock: python clock.py
4.Heroku 相關文件修改:
由於要在伺服器後台自動進行爬蟲,所以必須要使用空白資料庫的網站結構
(2)修改 <.gitignore.py>
為避免浪費 Heroku 的空間,一些不必要的檔案可以不上傳到 Heroku
在 <gamehero> 目錄中新增一個 <.gitignore> 檔(無法創建的話在最後加上一個「.」號即可創建),
<.gitignore> 檔內列出的檔案及資料夾,部屬時將不會上傳,內容如下:
*.pyc __pycache__ db.sqlite3 staticfiles
(3)修改 <prod_settiongs.py>
在 Heroku 中使用的設定會與本機執行的設定有些不同,因此另外建立一個 Heroku 用的設定檔是最好的方式
建議將<prod_settiongs.py>與<settings.py>放在相同的資料夾
先將原 <settings.py> 的所有內容導入,接著再寫入一些 Heroku 的特有設定,內容如下:
from .settings import * import dj_database_url DATABASES = { 'default': dj_database_url.config() } STATIC_ROOT = 'staticfiles' SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') ALLOWED_HOSTS = ['*'] DEBUG = False
(4)創建超級使用者帳號
由於沒有之前的資料庫,所以這裡要創建新的超級使用者,請在命令提示字元 視窗切換到網站檔案資料夾gamehero)輸入下列指令:
heroku run python manage.py migrate heroku run python manage.py createsuperuser
5.使用 git 進行更新:
在命令提示字元視窗啟動 herokuenv 虛擬環境,並切換到網站檔案資料夾(gamehero)
登入 heroku 伺服器 並進行所有檔案追蹤:
heroku login git add .
將檔案加入 Git 倉庫,並將此次便更命名為「crawler v1」:
get commit -am "crawler v1"
接著就能將檔案上傳到 Heroku 了:
git push heroku master
最後讓 Heroku 運行網站與新添加的clock.:
heroku ps:scale web=1 heroku ps:scale clock=1
測試網站是否正常運作,可以用下列指令啟動瀏覽器並開啟網站首頁:
heroku open
由於 Heroku 會在閒置 30 分鐘後讓你的應用程序進入閒置狀態(每天至少要休眠6小時)
使用 kaffeine 的服務會定期 ping 你的 Heroku 網站
或是藉由 uptimebot 網站來定期呼叫你的網站
也可以設置每天的休眠時間
這樣就可以讓後台爬蟲穩定的執行了
留言列表