VBA大量爬蟲程式:陣列、Application.Wait、Hyperlinks實務應用

VBA網路爬蟲當資料量相當大的時候,必須經過適當設計避免程式過載而中斷失敗。本文以網頁排行榜為範例,介紹陣列、Application.Wait、Hyperlinks、Call等工具如何實務應用。

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

一、新舊資料比對

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

VBA大量爬蟲程式:陣列、Application.Wait、Hyperlinks實務應用 1

二、VBA陣列應用

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

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

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

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

VBA大量爬蟲程式:陣列、Application.Wait、Hyperlinks實務應用 3

三、新增資料標記

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

VBA大量爬蟲程式:陣列、Application.Wait、Hyperlinks實務應用 5

四、網路爬蟲判斷

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

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

VBA大量爬蟲程式:陣列、Application.Wait、Hyperlinks實務應用 7

五、VBA Hyperlinks.Delete

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

VBA大量爬蟲程式:陣列、Application.Wait、Hyperlinks實務應用 9

六、VBA Call合併

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

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

VBA大量爬蟲程式:陣列、Application.Wait、Hyperlinks實務應用 11

七、VBA爬蟲專案

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

VBA大量爬蟲程式:陣列、Application.Wait、Hyperlinks實務應用 13

VBA大量爬蟲程式設計

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

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

每天學習,每天充電:VBA爬蟲專案系列文章

延伸閱讀: