Python通過cron或schedule實(shí)現(xiàn)爬蟲的自動(dòng)定時(shí)運(yùn)行
1. 為什么要設(shè)置定時(shí)爬蟲任務(wù)?
爬蟲通常會(huì)定期采集網(wǎng)站數(shù)據(jù)來獲得最新信息,但手動(dòng)運(yùn)行爬蟲既耗時(shí)又容易遺漏。自動(dòng)化定時(shí)爬蟲有以下幾個(gè)好處:
- 節(jié)省時(shí)間:定時(shí)任務(wù)不需要人工干預(yù),每次自動(dòng)執(zhí)行。
- 減少工作量:避免手動(dòng)啟動(dòng)爬蟲程序的重復(fù)工作。
- 實(shí)時(shí)性:可以隨時(shí)獲取最新的數(shù)據(jù)。
- 提高效率:不論是數(shù)據(jù)采集還是定期更新內(nèi)容,都能更加高效地執(zhí)行。
2. 什么是 cron 和 schedule
cron
cron 是 Unix 和 Linux 系統(tǒng)中一種定時(shí)任務(wù)管理器,允許用戶通過“時(shí)間表”配置文件自動(dòng)運(yùn)行腳本??梢允褂?crontab 命令添加和管理 cron 任務(wù),它的配置語法簡潔而強(qiáng)大。利用 cron 設(shè)置定時(shí)爬蟲任務(wù)非常靈活,適用于幾乎所有定時(shí)任務(wù)。
schedule
schedule 是一個(gè) Python 庫,允許我們?cè)?Python 腳本中直接設(shè)置定時(shí)任務(wù),支持多種頻率如每分鐘、每小時(shí)、每天等。它的代碼簡單明了,不需要離開 Python 環(huán)境去編寫外部配置文件。
3. 使用 cron 定時(shí)執(zhí)行爬蟲任務(wù)
如果您使用的是 Linux 或 Mac 系統(tǒng),cron 是一個(gè)可靠的選擇。我們可以將爬蟲腳本設(shè)置為 cron 任務(wù),讓它定期自動(dòng)執(zhí)行。
3.1 創(chuàng)建爬蟲腳本
首先,創(chuàng)建一個(gè)簡單的 Python 爬蟲腳本 my_spider.py,以便我們進(jìn)行定時(shí)運(yùn)行設(shè)置。這里我們假設(shè)爬蟲的內(nèi)容是打印當(dāng)前時(shí)間來模擬數(shù)據(jù)采集:
# my_spider.py
import datetime
def run_spider():
# 模擬爬取數(shù)據(jù)
print(f"正在采集數(shù)據(jù),時(shí)間:{datetime.datetime.now()}")
if __name__ == "__main__":
run_spider()
3.2 設(shè)置 cron 任務(wù)
接下來我們將這個(gè)腳本設(shè)置為 cron 任務(wù)。以下是設(shè)置步驟:
打開 crontab 配置文件
使用以下命令打開當(dāng)前用戶的 crontab 配置:
crontab -e
添加定時(shí)任務(wù)
在 crontab 配置文件中添加一行任務(wù)配置,格式如下:
* * * * * /usr/bin/python3 /path/to/your/my_spider.py
該格式表示每分鐘運(yùn)行一次任務(wù),其中:
* * * * *分別代表 分鐘、小時(shí)、日、月、星期。/usr/bin/python3是 Python 解釋器路徑。/path/to/your/my_spider.py是爬蟲腳本的路徑。
如果想每天凌晨 1 點(diǎn)運(yùn)行爬蟲,可以修改為:
0 1 * * * /usr/bin/python3 /path/to/your/my_spider.py
保存并退出
保存修改,退出編輯器。此時(shí) cron 已設(shè)置好任務(wù),系統(tǒng)將按設(shè)定的時(shí)間自動(dòng)運(yùn)行爬蟲腳本。
3.3 檢查任務(wù)運(yùn)行
要查看任務(wù)是否正常運(yùn)行,可以檢查爬蟲的輸出或 cron 日志文件。部分系統(tǒng)的 cron 日志在 /var/log/syslog 中,運(yùn)行以下命令查看:
tail -f /var/log/syslog
3.4 cron 語法簡介
在 cron 中時(shí)間設(shè)置的格式為:
* * * * * | | | | | | | | | └── 星期幾 (0 - 7, 0 和 7 都表示周日) | | | └──── 月份 (1 - 12) | | └────── 日期 (1 - 31) | └──────── 小時(shí) (0 - 23) └────────── 分鐘 (0 - 59)
例如:
*/10 * * * *:每 10 分鐘執(zhí)行一次。0 0 * * 1:每周一凌晨執(zhí)行一次。
4. 使用 schedule 在 Python 中設(shè)置定時(shí)任務(wù)
schedule 是一個(gè) Python 庫,可以直接在 Python 代碼中設(shè)置定時(shí)任務(wù),無需外部配置文件。schedule 更加靈活,適合跨平臺(tái)使用。
4.1 安裝 schedule
schedule 庫可以通過 pip 安裝:
pip install schedule
4.2 使用 schedule 編寫定時(shí)爬蟲腳本
以下代碼展示了如何使用 schedule 來每分鐘自動(dòng)執(zhí)行一次爬蟲任務(wù):
# my_schedule_spider.py
import schedule
import time
import datetime
def run_spider():
print(f"正在采集數(shù)據(jù),時(shí)間:{datetime.datetime.now()}")
# 每隔 1 分鐘執(zhí)行一次
schedule.every(1).minutes.do(run_spider)
# 每天在指定時(shí)間執(zhí)行
schedule.every().day.at("01:00").do(run_spider)
# 運(yùn)行 schedule
while True:
schedule.run_pending()
time.sleep(1)
在這個(gè)腳本中,我們將 run_spider 函數(shù)設(shè)置為每分鐘執(zhí)行一次。同時(shí),schedule.every().day.at("01:00") 將任務(wù)設(shè)為每天凌晨 1 點(diǎn)運(yùn)行。while True 循環(huán)用于持續(xù)運(yùn)行 schedule 的任務(wù)檢查器,確保任務(wù)按時(shí)執(zhí)行。
4.3 更改執(zhí)行間隔
schedule 支持多種時(shí)間間隔設(shè)置:
schedule.every(1).hour.do(run_spider):每小時(shí)運(yùn)行一次。schedule.every().monday.do(run_spider):每周一運(yùn)行一次。schedule.every(2).days.do(run_spider):每隔兩天運(yùn)行一次。
at() 方法可以精確到小時(shí)和分鐘,如 .day.at("10:30") 表示每天上午 10 點(diǎn)半執(zhí)行任務(wù)。
4.4 執(zhí)行并查看結(jié)果
在命令行運(yùn)行 python my_schedule_spider.py 來啟動(dòng)定時(shí)任務(wù)。每次運(yùn)行都會(huì)打印當(dāng)前時(shí)間,方便查看任務(wù)的執(zhí)行情況。
4.5 schedule 與 cron 的區(qū)別
schedule 是在 Python 腳本內(nèi)設(shè)置定時(shí)任務(wù),這樣對(duì)開發(fā)者較為友好,而 cron 是通過操作系統(tǒng)層面管理任務(wù),更適合大規(guī)模部署場景。若任務(wù)較為簡單,schedule 更加方便快捷,但對(duì)于服務(wù)器端的長期任務(wù)來說,cron 更加穩(wěn)定可靠。
5. 自動(dòng)化爬蟲任務(wù)的注意事項(xiàng)
無論使用 cron 還是 schedule,在部署自動(dòng)化任務(wù)時(shí),以下幾點(diǎn)尤為重要:
網(wǎng)絡(luò)波動(dòng):爬蟲依賴網(wǎng)絡(luò),若在運(yùn)行時(shí)網(wǎng)絡(luò)不穩(wěn)定,可能導(dǎo)致任務(wù)失敗??杉尤氘惓L幚頇C(jī)制。
try:
run_spider()
except Exception as e:
print("Error:", e)
任務(wù)沖突:若多次任務(wù)運(yùn)行時(shí)間相近,可能會(huì)引起沖突。通過記錄上次爬取時(shí)間,避免重復(fù)爬取。
數(shù)據(jù)重復(fù):對(duì)采集的 URL 或數(shù)據(jù)進(jìn)行去重,避免重復(fù)保存。
存儲(chǔ)管理:數(shù)據(jù)量較大時(shí),建議定期整理存儲(chǔ)的文件或數(shù)據(jù)庫,避免磁盤空間不足。
資源監(jiān)控:定時(shí)任務(wù)會(huì)占用一定的 CPU 和內(nèi)存,若服務(wù)器資源有限,應(yīng)適當(dāng)控制爬蟲的運(yùn)行頻率。
6. 小結(jié)
自動(dòng)化定時(shí)爬蟲是數(shù)據(jù)采集的重要環(huán)節(jié)。本文介紹了使用 cron 和 schedule 來定時(shí)運(yùn)行 Python 爬蟲的方法。cron 適合在服務(wù)器端的定時(shí)任務(wù)管理,而 schedule 適合在 Python 腳本中簡單地實(shí)現(xiàn)自動(dòng)化任務(wù)。合理運(yùn)用定時(shí)任務(wù)可以大幅提高爬蟲數(shù)據(jù)采集的效率,并確保采集到最新的數(shù)據(jù)。
以上就是Python通過cron或schedule實(shí)現(xiàn)爬蟲的自動(dòng)定時(shí)運(yùn)行的詳細(xì)內(nèi)容,更多關(guān)于Python cron或schedule定時(shí)運(yùn)行的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)將n個(gè)點(diǎn)均勻地分布在球面上的方法
這篇文章主要介紹了Python實(shí)現(xiàn)將n個(gè)點(diǎn)均勻地分布在球面上的方法,涉及Python繪圖的技巧與相關(guān)數(shù)學(xué)函數(shù)的調(diào)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
用Python實(shí)現(xiàn)定時(shí)備份Mongodb數(shù)據(jù)并上傳到FTP服務(wù)器
這篇文章主要介紹了用Python實(shí)現(xiàn)定時(shí)備份Mongodb數(shù)據(jù)并上傳到FTP服務(wù)器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
詳解如何利用Pytest?Cache?Fixture實(shí)現(xiàn)測試結(jié)果緩存
這篇文章主要為大家詳細(xì)介紹了如何利用Pytest?Cache?Fixture實(shí)現(xiàn)測試結(jié)果緩存,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-09-09
python中文件的創(chuàng)建與寫入實(shí)戰(zhàn)代碼
這篇文章主要給大家介紹了關(guān)于python中文件的創(chuàng)建與寫入的相關(guān)資料,在Python中文件寫入提供了不同的模式和方法來滿足不同的需求,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
python機(jī)器學(xué)習(xí)理論與實(shí)戰(zhàn)(二)決策樹
這篇文章主要介紹了python機(jī)器學(xué)習(xí)理論與實(shí)戰(zhàn)第二篇,決策樹的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Python實(shí)現(xiàn)基于Fasttext的商品評(píng)論數(shù)據(jù)分類的操作流程
這篇文章主要介紹了Python實(shí)現(xiàn)基于Fasttext的商品評(píng)論數(shù)據(jù)分類,今天使用的fasttext更像是一個(gè)集成的庫,把向量化和分類一起做掉了,這個(gè)對(duì)于使用層面來講就更方便了一些,需要的朋友可以參考下2022-06-06
python opencv圖片編碼為h264文件的實(shí)例
今天小編就為大家分享一篇python opencv圖片編碼為h264文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
利用Python實(shí)現(xiàn)字幕掛載(把字幕文件與視頻合并)思路詳解
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)字幕掛載,把字幕文件與視頻合并,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10

