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 發表在 痞客邦 留言(1) 人氣()