VBA Application.Wait:爬蟲範例中暫停10秒鐘的用法

VBA Application.Wait會讓程式停止一段時間,在連續爬蟲取得大量資料時可以作為緩衝。本文以網頁排行榜為例,介紹如何暫停10秒鐘的用法,補充其它相關的輔助工具。

上一節成功網路爬蟲取得100個網頁的特定資料,雖然設計好了緩衝等候時間和重覆嘗試的機制,但一次要花很多時間。可是以本書範例而言,每天排行榜中只有少部份是新書,大部份是跟昨天的書今天仍掛在排行榜。這些「舊書」其實直接取昨天爬蟲所得資料即可,毋須再抓一次,很多時間可以節省下來,本節介紹如何設計相關程式,進而彙總全部所需資料。

一、新舊資料比對

由於每天都是和先前所取得的資料比對,確認是否有新書上榜,因此先將上一節所取得100本書籍資料整理成清單,工作表名稱設定為「書籍補充資訊列表」,當作是已收集過的資料庫清單。

E30k11

二、VBA陣列應用

建立「彙總書籍資訊」VBA程式,準備以這個程序作為樞紐,利用Call方式完成一系列自動操作。

「取得網頁網址(當天工作表)」的內容是本章第二節取得排行榜書籍網址的程式,基本上是完全一樣的程式碼,差別只在使用「當天工作表」作為參數傳遞,在此不再截圖展示,讀者有需要可參考本書所附程式範例。

「標記當天新書(當天工作表)」先以迴圈將當天帶網址的排行榜工作表第五欄依序都填入「新書」,再應用本章第三節介紹的VBA陣列功能,宣告動態不固定項目的陣列變數(「書籍資料庫()」),設定陣列值為上個步驟的資料清單(Range(“A1”).CurrentRegion),這裡的Range(“A1”).CurrentRegion是以儲存格A1為基準向四周延伸的目前範圍,作用類似於Excel中Ctrl+A。

接著以這個陣列內容執行集合迴圈(「For Each book In 書籍資料庫)」,如果在書籍資料庫裡有任何一本書與當天書籍第i本書相同,表示並非新書,將相對應儲存格寫入空格,等於是清除原本「新書」的標記。

E30k21

三、新增資料標記

執行程式之後,果然在第五欄(E欄)部門書籍標記新書,總共「項目個數:14」,相較於全部100本書少了許多。

E30k31

四、網路爬蟲判斷

沿用上一節「取得出版社資料(當天工作表)」程式,這裡因為是新書才抓取資料,因此調整「Application.Wait Now + TimeValue(“00:00:10”)」的位置,在開啟IE之前先判斷是否為新書(「If Worksheets(當天工作表).Cells(i, 5) = “”」),如果不是的話,結束副程式(「Then Exit Sub)),如果是的話,暫停緩衝10秒鐘。

除了出版社資料,也需要分類資料,這部份主要的程式架構同樣沿用上一節內容,具體程式內容則是跟這個步驟一樣,在此不再細述,讀者有需要可參考本書範例。

E30k41

五、VBA Hyperlinks.Delete

所有新書都取得所需資料之後,把非新書部份刪除,原輔助判斷是否為新書的第五欄刪掉,將新書都複製到工作表「書籍補充資訊列表」,這部份的主程式架構是沿用上一章最後第五節內容。最後有特別去除所有儲存格連結(Cells.Hyperlinks.Delete),同時設定字體(Cells.Font.Name = “Noto Sans CJK TC Medium”),這裡的Noto是作者習慣的Google免費字體,讀者也可以改為Windows系統內置的微軟正黑體。

E30k51

六、VBA Call合併

最後將所有副程式以Call合併,如此設置除了與先前章節銜接,同時讓整個專案架構更加清楚,分開也是有利於個別測試,因為實際在設計程式時,大部份時候都不是一次寫好,而是修修改改,邊測試邊寫的。

這裡有兩個重點補充:首先因為排行榜是每天取得,因此「當天工作表」以傳遞參數的方式貫穿整個專案。另外全部程式的執行時間較久,在最後特別加一行「MsgBox “程式執行完畢”」,起到通知作用 。

E30k61

七、VBA爬蟲專案

全部專案執行完後是以簡潔的報表呈現,過程中其實新建了工作表、取得資料進行很多條件判斷的處理。

E30k71

VBA大量爬蟲程式設計

這一節限縮了網路爬蟲在新書的範圍內,減少程式執行次數,其實如果考量分類或出版社可能改變,當然還是可以和上一節相同設定為跑100次。不過可以合理判斷這種情形不太可能發生,基於範例特性及效率考量,配合調整程式,讀者如果有遇到真的必須大量網路爬蟲的需求,可參考上一節方式設計程式。

最後補充一點,先前章節VBA程式範例都是英文名稱宣告變數,從這一節程式可以看到其實也可以中文命名變數。英文編寫是一般程式設計的習慣,因為幾乎所有程式的原生語言皆為英文,直接以英文設定變數很自然,中文變數的好處是容易理解,不過如果有可能會切換系統或者應用的語言環境的話,全英文還是最穩定的作法。


贊贊小屋VBA教學中心:

Excel巨集錄製教學Excel巨集程式VBA編輯器VBA自學入門VBA基礎語法VBA基本應用VBA UserFormVBA VLOOKUP

取得範例程式請前往VBA社團,訂閱請加入VBA Line社群

VBA課程推薦:零基礎入門進階的20小時完整內容

VBA課程:20小時完整入門進階,職場及投資應用

最新文章: