close

Python Django 實作(三) 用 abscheduler 在 Heroku 後台執行定時爬蟲程式

 

在 遊戲資訊系統 專案中,爬蟲寫在前台頁面的連結,待使用者點擊後執行

這對於使用者的體驗並不良好,所以最好的辦法就是讓爬蟲程式在後台定期運行,

間隔一段時間就會定期爬蟲一次,並將資料儲存到資料庫

流程、

分為五個部分:

  1. 安裝 abscheduler
  2. 從 views.py 分離爬蟲程式
  3. 設置 clock.py
  4. Heroku 相關文件修改
  5. 使用 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  網站來定期呼叫你的網站

也可以設置每天的休眠時間

這樣就可以讓後台爬蟲穩定的執行了

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 ivankao 的頭像
    ivankao

    IvanKao的部落格

    ivankao 發表在 痞客邦 留言(1) 人氣()