Hi大家好,
這是我參加 iT 邦幫忙鐵人賽的第 1 次挑戰,這次的主題聚焦在結合 Python 爬蟲、RAG(檢索增強生成)與 AI,打造一套 PTT 文章智慧問答系統。在過程中,我會依照每天進度上傳程式碼到 GitHub ,方便大家參考學習。也歡迎留言或來信討論,我的信箱是 gerryearth@gmail.com。
在昨天成功建立並測試了 Celery 任務之後,今天我們要進一步讓爬蟲「自動化」起來!
透過 Celery Beat 的定時排程功能,我們可以讓系統按照設定的時間間隔,自動去 PTT 指定的版面抓取文章,不需要人工手動觸發。
這樣一來,不管是每小時監控熱門看板,還是每天定時更新資料,都能輕鬆完成。接下來就一步步帶你完成設定吧!
請先建立名稱為 celery_app
的新資料夾,並在資料夾中建立 __init__.py
,讓該資料夾被視為一個 package ,這樣 Python 解譯器就可以將它當作模組來匯入和使用。
並且把前面已經寫好的 scraper.py
放進資料夾中,統一管理 celery 相關任務。
昨天測試沒問題的話就來在 scraper.py
建立 celery 的排程任務吧!
from ptt_rag_dev.celery import app
@app.task()
def period_send_ptt_scrape_task():
board_list = ['Gossiping', 'NBA', 'Stock', 'LoL', 'home-sale']
for board in board_list:
ptt_scrape(board)
這裡我打算爬五個指定版面,當然也可以自己設計喔!
幾天後這裡將會使用 chain 串接多個任務。
任務寫好了還必須設定 Celery 任務佇列系統的配置,具體來說是指定匯入哪些模組,並安排定時任務,所以請在 celery.py
最後加上:
app.conf.imports = [
"celery_app.scraper",
]
app.conf.beat_schedule = {
'scrape-every-hour': {
'task': 'celery_app.scraper.period_send_ptt_scrape_task', # 指定任務位置
'schedule': 3600, # 定時3600秒
}
}
app.conf.imports
用來設定 Celery 應該要匯入哪些模組(modules)來尋找任務(tasks)app.conf.beat_schedule
用來設定定時任務,設定每隔3600秒跑一次period_send_ptt_scrape_task
到這邊差不多較告一個段落了,我們可以測試一下能不能正常運作。
首先使用 Docker 部屬:
docker-compose up -d --build
接下來進去各個容器是否正常運作,沒意外的話每隔一小時就會自動爬蟲,將 PTT 文章存入資料庫。
由於定時任務一開始不會執行,會等到定時時間到了才執行,可以暫時把3600秒改為60秒進行測試。
因為我們之前沒有在 Docker 上遷移資料庫,因此在 Docker 啟用的時候必須記得遷移資料庫!
先進入 Docker 的
django_web
,再遷移資料庫:docker exec -it django_web /bin/bash
python manage.py makemigrations python manage.py migrate
明日預告【Day 12】監控與除錯 - 記錄爬蟲執行 Log 並儲存至資料庫
下一篇將補上每次爬蟲的執行紀錄,包括任務時間、結果與錯誤訊息,方便後續監控與除錯。