對於Python的網路爬蟲程式有了初步的概念及練習之後, 想到如果有的網站需要每天去捉取資料, 或者大批分頁資料要抓取, 有時會被網站的後台擋下來, 目前的做法是人工每天執行程式, 或是每抓一分頁資後, 再修改程式的內部參數抓取其他分頁......
既然都已經寫成了程式, 不能時間到時自動執行嗎?
初步的想法是程式內做計時功能的迴圈, 讓程式一直在工作狀態只是等時間到自動執行.....但這個方法, 會讓程式變得很麻煩, 且電腦要一直開機, 程式又一直在佔用電腦的系統資源....
請教 Google 大神之後, 得知 windows工作排程, 可以協助定期讓電腦自動執行一些指令及程式...於是著手進行程式的修正及規劃
以下是我的程式範例
#這是測試排程的Python程式
import csv
#開啟控制次數的CSV檔案
with open('次數.csv', newline='', encoding='utf-8') as f:
rows = csv.reader(f, delimiter=',')
for row in rows:
n = row[0]
print(n)
#執行 5次後停止執行
if int(n) < 6:
#執行所需的程式片段(例如爬蟲)
number_list = []
for i in range(1,1000000*int(n)):
number_list.append(i)
print(number_list)
#執行完將計數寫回CSV檔案
with open('次數.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f, delimiter=',')
writer.writerow([str(int(n)+101)[1:]])
- 這個程式利用一個資料檔
次數.csv
來記錄Python程式每次執行的結果, 以便下次執行時, 接著上次的動作來繼續 - 在我們要抓取大量分頁資料時, 可以利用上述
次數.csv
的資料檔來記錄已下載到第幾個分頁了 - 也就是我在 次數.csv 的檔案內容存放初始值 01
- 然後去執行上述的程式時, 只要完成每一次的動作之後, 會將資料回寫至
次數.csv
的檔案內, 我這裡是每次加 1 然後回存 - 也就是第一次執行時, 會抓取第 1頁資料, 第二次執行時, 會抓取第2頁資料....
- 我的範例程式是設定執行第5次之後, 只有空跑, 沒有執行內部的程式片段
為何要在程式中設計這樣的 邏輯判斷
呢? 在 Windows 工作排程設定重覆執行 5次後停下來, 不就好了嗎???
原因在於抓取網頁資料時, 若程式被擋時, 程式會中斷且資料沒有抓取成功, 所以不能保證工作排程設定 5次重覆執行, 就會抓取 5次的資料, 因此在排程上我通常會重覆許多次, 然後在程式中控制抓取次數....
這個程式範例只要在 要執行的程式片斷
被中斷時, 就不會回寫 計數
到 次數.csv
中, 所以下次再執行時, 就會再執行一次
說明如下:
- 一開始
次數.csv
的內容為01 - 程式被 工作排程 啟動, 而且程式執行成功, 此時 計數加 1 , 將 02 內容寫入
次數.csv
- 工作排程的排定時間到時, 程式再次被啟動, 此時程式被中斷, 而
次數.csv
中的內容仍然是 02 - 下一個工作排程的時間到, 程式再次被啟動, 程式執行成功, 此時
次數.csv
中的內容變動為 03
根據上述的方法, 我們就可以在 次數.csv
來記錄程式的執行次數(或抓取內容的頁數), 然後下次執行時, 再接著執行
Windows 工作排程的設定
Python程式寫法了, 要如何設定 Windows的工程排程?
在
Windows系統管理工具
中有一個工作排程器
點選
動作
選項中的建立工作
, 會出現 建立工作的視窗
在
一般
的選項中輸入 工作名稱(必填), 描述(選填)
在
觸發程序
的選項中 新增 我們要的排程時間 (若有資料時, 可以按編輯修改)
這裡我是用 依排程執行, 目前是僅一次來設定 (若是要每天執行, 可以設定成每天)
設定由 3/12 早上 9:40 開始執行, 每10分鐘重覆一次, 一直執行到 中午 12:28
在
動作
的選項中 新增 要執行的程式
程式或指令碼 輸入 Python
新增引數 輸入 排程.py (這裡輸入你寫好的 Python 程式 檔案名稱)
開始位置 輸入 上面引數中的 python 程式檔案 所在的目錄 (我的是在 D槽)
其他的
條件
及設定
選項, 我沒有使用, 可以依你的需求來設定- 按確定, 就可以看到 工作已排入排程中
我原本設定 9:40開始執行, 因為超過時間, 所以沒有執行, 下一個執行時間為 9:50 (我設定每10分鐘執行一次)
當然你可以按右邊的執行
來強制執行
以上是我的筆記, 歡迎大家留言互相討論