[VBA] 網路爬蟲 真簡單

何謂「 VBA 網路爬蟲 」?

※ 先就字面來解釋 :
VBA : 是Visual Basic for Applications的縮寫,是一種在Microsoft Office應用程式中使用的程式語言,可透過Excel、Word、PowerPoint等軟體,進行設計開發,以達到自動化運作的目的。

網路爬蟲 ( Web crawler ) : 是一種利用程式的特定演算法和規則,自動探索網頁,並擷取網頁上的資訊,整理成結構化的數據。例如 : 文字、圖片、影片、鏈結等等。

VBA 網路爬蟲 : 便是利用VBA語言寫成的網路爬蟲程式。可以使用Excel等Office軟體作為基礎,透過網路爬蟲技術,從網路上蒐集數據,並將其整理成結構化的資料格式,以供使用者做進一步的數據分析或其他用途。

常用的 VBA 網路爬蟲 工具

☆ VBA 常用的三種網路爬蟲工具 — QueryTable / XMLHTTP 物件 / 操控 IE

[ A ] QueryTable : Excel內建的網路資料擷取工具。可輕鬆地從外部數據源中擷取資料,方便於數據分析和報表生成。Excel財經教學文章中,大多採用此方法,來擷取證交所每日公告資訊。
[ 參考 ] : 擷取 證交所 / 三大法人現貨買賣超

[ B ] XMLHTTP 物件 : 它能夠在網頁上發送 HTTP 請求和接收 HTTP 響應的 API,這使得網頁可以通過 JavaScript 代碼與遠端伺服器進行互動,而不需要刷新整個網頁,擷取網頁資料。
[ 參考 ] : 製作 借券賣出排行榜

[ C ] 操控 IE : 是一種自動化瀏覽器測試和網頁自動化的技術,它通常使用 VBScript 或 JavaScript 等腳本語言透過 Microsoft Internet Explorer ( IE ) 瀏覽器的 COM 介面來實現,擷取網頁資料。
[ 參考 ] : 操控IE,秒抓 資產負債表

[ 提醒 ] :
◎ 若您從未接觸過網路爬蟲,建議您先嘗試以 QueryTable 的方式,來爬取目標網頁。雖然 QueryTable 可以用來從外部數據源中擷取數據,但它只支援一些特定的數據源,例如 : 關聯式數據庫、文本文件等。

PS. 像 公開資訊觀測站 的網頁,已經更新版本,取消以文本文件方式呈現,故無法再以 QueryTable 的方式,擷取財務報表的網頁資料。只好改用 XMLHTTP操控 IE 的方式處理。

認識「 網頁

※ 一個網頁皆由多個元素跟組件所組成,其包含的元素如下 :
[ 1 ] : HTML : 是網頁的結構基礎,它定義了網頁的內容和布局,使用 HTML 標記來定義元素、屬性和其它結構。
[ 2 ] : CSS : 用於控制網頁的樣式和版面設計。它可以使網頁看起來更美觀和統一,例如 : 設置背景顏色、文字顏色和字體等。
[ 3 ] : JavaScript : 是一種網頁編程語言,它可以為網頁添加交互和動態效果,例如 : 網頁表單驗證、滾動條控制、彈出視窗等。
[ 4 ] : Title (標題) : 是網頁的標題,通常顯示在瀏覽器的標籤欄中。標題可以描述網頁的主題和內容,也可以用於搜索引擎優化(SEO)。
[ 5 ] : Header (標頭) : 是網頁頂部的區域,通常包含網站的標誌、菜單、搜索框等元素。標頭可以幫助用戶快速找到所需內容,提高網站的易用性和品牌形象。
[ 6 ] : Body (主體) : 是網頁的核心區域,通常包含網頁的主要內容,例如 : 文章、產品展示、圖片、視頻等。
[ 7 ] : Footer (尾部) : 是網頁底部的區域,通常包含網站的版權信息、聯繫方式、社交媒體鏈接等元素。尾部可以提供網站的相關信息和導航,增強網站的信任度和用戶體驗。
[ 8 ] : Link (鏈接) : 用於連接網頁和外部資源,例如 : 圖片、CSS 文件和 JavaScript 文件等。

[ 溫馨提醒 ] :
電腦爬蟲著重在網頁資料的擷取,除非您想深入研究網頁的設計,否則無需太深入了解 CSSJavaScript,焦點放在網頁的結構布局即可。

HTML 基本架構

HTML : 是一種用於創建網頁的標記語言,它定義了網頁的內容和布局。想爬取網頁的資料,就必須先了解它的組成結構。
HTML 基本架構

HTML 網頁對照圖

證交所 — 加權股價指數歷史資料

< A > : 實際網頁對照圖 : 以 證交所 — 加權股價指數歷史資料 為例。( PS. 網址 : https://www.twse.com.tw/zh/indices/taiex/mi-5min-hist.html )
VBA 網路爬蟲

[ 對照圖 – 操作步驟 ] :
[ 1 ] : 開啟 證交所 網址 : 開啟瀏覽器鍵入 加權股價指數歷史資料 網址 : https://www.twse.com.tw/zh/indices/taiex/mi-5min-hist.html
[ 2 ] : 開啟 Chrome 開發者工具 : 按下 > 滑鼠右鍵 – 點選 : 檢查 或 直接按下 > 鍵盤 : F12 鍵,螢幕右半邊會彈出 Chrome 開發者工具 畫面。
[ 3 ] : 執行網頁刷新 : 剛啟動 Chrome 開發者工具時,網頁資料並未與之連結,必須先按下 : Ctrl + R 或是 F5 鍵,將網頁刷新,才能連結網頁資料。
[ 4 ] : 點擊 檢查工具 : 在 Chrome 開發者工具中,有個非常好用的工具 : ,它可以直接顯示網頁中任何元素的使用語法。
[ 5 ] : 點擊 內容標題 : 點擊完 後,便移動游標至左邊網頁,點擊 內容標題 : 112年04月 發行量加權股價指數歷史資料,其HTML設計語法位置,顯示在右邊 Elements 文件夾裡。( PS. 位置包覆在 <body> 裡面。)
[ 6 ] : 點擊 內容區段 : 再點擊 內容標題 : 日期內容資料 : 112/04/06,同樣會顯示出來。( 參考下圖 )
VBA 網路爬蟲

[ 溫馨提醒 ] :
※ 針對 股票 / 期貨 / 選擇權 的數據爬蟲,均著重在 <body> …… </body> 的內容區段,相較起來,也簡單容易許多。

期交所 — 台指期交易行情查詢

< B > : 實際網頁對照圖 : 以 期交所 — 台指期交易行情查詢 為例。( PS. 網址 : https://www.taifex.com.tw/cht/3/futDailyMarketReport )
VBA 網路爬蟲

[ 對照圖 – 操作步驟 ] :
[ 1 ] : 開啟 期交所 網址 : 開啟瀏覽器鍵入 台指期交易行情查詢 網址 : https://www.taifex.com.tw/cht/3/futDailyMarketReport
[ 2 ] ~ [ 4 ] 步驟 : 參考 證交所對照圖 之操作方法。
[ 5 ] : 點擊 內容標題 : 點擊完 後,便移動游標至左邊網頁,點擊 內容標題 : 期貨每日交易行情查詢,其HTML設計語法位置,顯示在右邊 Elements 文件夾裡。( PS. 位置包覆在 <body> 裡面。)
[ 6 ] : 點擊 內容區段 : 台指期交易行情表 最重要的二個區段位置,就是 歷史資料查詢台股期貨(TX)行情表 的內容。

[ 歷史資料查詢 對照圖 ] :
※ 首先要瞭解 歷史資料查詢 內容是屬於哪個區段,你可以將滑鼠游標移動到下圖 <tbody> 的標籤位置,此時左邊網頁會呈現對應的反色區塊,這就表示歷史資料查詢的區段內容,全部包覆在 <tbody> </tbody> 標籤裡面。( PS. 內容資料的對照位置,請參考下圖。)
VBA 網路爬蟲

[ 台股期貨(TX)行情表 對照圖 ] :
※ 同 歷史資料查詢 的對照方式,滑鼠游標移動到下圖 <td> 的標籤位置,會發現網頁資料包含了當天的日期資料及幾項敘述,若不想爬取,就直接擷取 <tbody> 標籤內的內容(標題及資料)。( PS. 內容區段的對照位置,請參考下圖。)
VBA 網路爬蟲

HTML 語法介紹

◎ 在上列二組對照圖文本檔中,您會發現很多「 < > 」符號,在 HTML語言 中,尖括號「 < > 」用於標記 HTML元素 的開始(< >)和結束(</ >)。
例如 : <div> : 代表一個標籤,用於標記區段元素的開始,</div> : 用於標記區段元素的結束。

◎ 在Chrome 開發者工具的文件夾中,由於程式冗長,系統會以 ▶ (收起) 符號,將該區段程式碼收起來,使用者需要查看,則將其點擊,內容程式碼便會打開,原符號則變成 ▼ (開啟)。

[ HTML語法介紹 ] :
◎ 以 加權股價指數歷史資料 來介紹,請參考下圖 HTML 的語法名稱對照。
VBA 網路爬蟲

[ 語法說明 ] :
[ 0 ] : <div class=”main-content”> </div> : 意思是創建一個名為 main-content 的區段容器,來放置 112年04月 發行量加權股價指數歷史資料
[ 1 ] : div ( 標籤名稱 ) : 用來劃分網頁內容的不同區域,以便對其進行樣式和佈局控制。
[ 2 ] : class ( 屬性名稱 ) : 透過添加 class 屬性,可以將元素與相應的 CSS 樣式關聯起來,從而對其進行樣式設置和排版。
[ 3 ] : “main-content” ( 屬性值 ) : 屬性值可以為任何字符串,通常會使用有意義的名稱來描述容器內容的用途。
[ 4 ] : ( 資料內容 ) : 在程式 ▶ (收起) 的情況下,系統會呈現 的符號,代表容器中有內容資料。
◎ 點擊 ▶ 符號 ( 呈現 ▼ ),即打開內容資料,會發現一層包夾一層的標籤元素,每對標籤皆代表不同的HTML元素和含義。
[ 5 ] : /div : 結束此區段的操作。

VBA 網路爬蟲 — IE操控

※ 開始本文最重要的環節 — VBA 網路爬蟲,利用 VBA 網路爬蟲 最主要的目的,是要爬取 /期交所 每日盤後公布的交易資料,將其下載至EXCEL,再來做資料的整理與分析。

◎ 就個人的爬蟲經驗,IE操控 的爬蟲方法,對爬蟲新手來說是比較容易理解的。但由於 IE 已經無法滿足現代網路應用的需求,故微軟公司將其注意力轉移到了 Edge 瀏覽器,同時不再為 IE 提供重大更新和功能升級,所以很多網站慢慢的也不支援 IE 登入,像是 證交所新版網站。

◎ 不過本文還是先以 IE操控 來做介紹,實作 — 抓取期交所歷史資料,當是網路爬蟲新手教學,理解後,就更容易了解其他的爬蟲工具 (例如 : Selenium、WebDrive) 的操作方法。

IE 設定與連線

※ 開始實作 — 抓取期交所歷史資料,若有看過我的 網路爬蟲 — 操控IE,秒抓上市櫃公司財務報表 系列文章,對這 IE的設定與連線,應該不陌生。
[ A ] : 首先,設定 IE 物件 : Set IE = CreateObject(“InternetExplorer.Application”)
[ B ] : 設定欲瀏覽網頁 – 期貨每日交易行情查詢 網址 : URL = “https://www.taifex.com.tw/cht/3/futDailyMarketReport”
[ C ] : 設定是否顯示網頁連線畫面 : IE.Visible = True ( PS. True : 顯示 / False : 不顯示 )
[ D ] : IE 連線到 現金流量表 頁面 : IE.Navigate URL

    [ 程式碼 / IE 設定與連線 ] :
    Set IE = CreateObject("InternetExplorer.Application") 
    URL = "https://www.taifex.com.tw/cht/3/futDailyMarketReport" 
    IE.Visible = True 
    IE.Navigate URL 

[ E ] : IE 連線後,等待網頁加載完成 :

    [ 程式碼 / 等待網頁加載完成 ] : 
    Do Until Not IE.Busy And IE.readyState = 4 
            DoEvents 
    Loop

◎ 完成以上步驟,系統根據 IE.Visible = True ( 顯示頁面 ),則彈出IE瀏覽器視窗,顯示 : 期貨每日交易行情查詢 網頁。畫面如下 :
期交所 歷史交易資料

◎ 進入查詢網頁,期貨每日交易行情查詢 的預設為 : 最新日期資料,若只查看最新資料,便不必做任何輸入修改的動作,只需按下 : 送出查詢 按鈕,即可。

模擬 / 輸入查詢資料

◎ 在 期交所 — 台指期交易行情查詢 的對照圖中,已經有說明如何操作 Chrome 開發者工具,來查找網頁資料的 HTML 相對應語法。這裡就實作一次,抓取 台指期的歷史交易資料。

[ 抓取 台指期歷史交易資料 操作步驟 ] :
[ 1 ] : 開啟 Chrome 開發者工具 : 按下 > 滑鼠右鍵 – 點選 : 檢查 或 直接按下 > 鍵盤 : F12 鍵,螢幕右半邊會彈出 Chrome 開發者工具 畫面。


[ 2 ] : 執行網頁刷新 : 剛啟動 Chrome 開發者工具時,網頁資料並未與之連結,必須先按下 : Ctrl + R 或是 F5 鍵,將網頁刷新,才能連結網頁資料。


[ 3 ] : 點擊 檢查工具 : 在 Chrome 開發者工具中,有個非常好用的工具 : ,它可以直接顯示網頁中任何元素的使用語法。
[ 4 ] : 點擊 日期 / 交易時段 / 契約 輸入框 : 點擊完 後,便移動游標至左邊網頁,個別點擊 : 日期 / 交易時段 / 契約 輸入框,其HTML設計語法,會顯示在右邊 Elements 文件夾裡。


[ 日期 輸入框之HTML語法 ] :
VBA 網路爬蟲

[ 語法說明 ] :
[ 1 ] : 點擊 : 日期輸入框後,會發現Chrome 開發者工具中出現淺藍色的背景橫條,顯示的資料便是相對應的 HTML語法。( 參考上圖 )

[ 2 ] : 在前頭已經說明 IE操控 對於爬蟲新手來說,相對容易學習,原因是 : 語法簡單,容易明瞭。只要了解要抓取的關鍵標的,就能用 IE.document.getElement 來爬取網頁上的資料。
◎ 其中,IE.document 是固定指令,指的是使用 JavaScript 操作 IE 時,所獲取的文檔(document)對象。這也就是程式前頭所設定的IE連線。再從文檔中取出 (getElement) 想抓取的標的資料。

[ 3 ] : 相對應語法中顯示的 id =”queryDate”value=”2023/04/13″,就是我們要爬取的關鍵標的。
◎ 其理由是 : 在 HTML文檔中,屬性名稱 id 的屬性值 (“queryDate”) 必須是唯一,所以很容易識別抓取,直接使用 getElementById 指令,即可。( PS. 要注意常常會發生錯誤的地方就是 Element 沒有加 s (因為它是唯一),跟 getElementsByClassName / getElementsByTagName 不同。)
value=”2023/04/13″( 預設 : 當日收盤日期 ) 是已經顯示在輸入框內的日期資料,只要將其數值改掉,換成其他查詢日期,便能抓取欲抓取的日期資料。

PS. 語法相當簡單容易,IE.document.getElementById(“queryDate”).value=”2023/04/13″,就是將查詢日期改為 : 2023/04/13
→ 若想在Excel工作表[A1]欄位中寫入查詢日期資料,可以這樣寫 : [A1] = IE.document.getElementById(“queryDate”).value

[ 交易時段 輸入框之HTML語法 ] :
VBA 網路爬蟲

[ 語法說明 ] :
[ 1 ] : 同 日期輸入框 的模式,不同的是此輸入框是以 下拉式選單 的方式來設計,只有兩個選項 : “0” (一般交易時段) / “1” (盤後交易時段)。

[ 2 ] : 關鍵標的屬性值 : id =”MarketCodevalue=”0″ or “1”。( PS. 預設 : “0” / 一般交易時段 )

[ 3 ] : 套入日期輸入框的說明,若想抓取 盤後交易時段的資料,語法為 : IE.document.getElementById(“MarketCode”).Value = “1”
→ 若想在Excel工作表[A1]欄位中寫入一般交易時段的內容資料,公式為 : [A1] = IE.document.getElementById(“MarketCode“)(0).innerText。( PS. 因為是下拉式選單,有多種選項,故要以順序來選擇標的資料。0 : 是元素中的第一個選項,也就是 : 一般交易時段。)

[ 契約 輸入框之HTML語法 ] :
VBA 網路爬蟲

[ 語法說明 ] :
[ 1 ] : 同 日期輸入框 的模式,不同的是此輸入框也是以 下拉式選單 的方式來設計,其選項 : 有將近30組的期貨產品,可供選擇。( PS. 本文只針對 台指期(TX) 做說明。)

[ 2 ] : 關鍵標的屬性值 : id =”commodity_idtvalue=”TX”。( PS. 台指期(TX) : 同樣也是預設值,若想抓取小台指,改成 : value=”MTX”,即可。)

[ 3 ] : 套入日期輸入框的說明,若想抓取 台指期的契約資料,語法為 : IE.document.getElementById(“commodity_idt“).Value = “TX”
→ 若想在Excel工作表[A1]欄位中寫入台指期的契約資料,公式為 : [A1] = IE.document.getElementById(“commodity_idt“)(10).innerText
( PS. 因為是下拉式選單,有多種選項,故要以順序來選擇標的資料。0 : 是元素中的第一個選項,也就是 : 布蘭特原油期貨(BRF)。但台指期(TX) 排位順序在第10,有點怪,不過沒關係一般也不會這樣來抓,讓大家知道方法而已。)

模擬 / 按下查詢按鈕

※ 完成三組輸入框內的資料,就要來模擬按鍵 — 按下 : 送出查詢 按鈕。

[ 送出查詢 按鈕之HTML語法 ] :
VBA 網路爬蟲

[ 語法說明 ] :
[ 0 ] : 按鈕的做法跟上面的輸入資料不同,必須有個模擬 : 按下(Click) 的動作,才會觸發按鈕。

[ 1 ] : 首先同輸入資料一樣,先找出 送出查詢 按鈕的 HTML語法位置,關鍵的標籤名稱 : inputvalue=”送出查詢
( PS. 此時,你可能會質疑 — 不是說文本中只能有一個 id屬性,那只要 getElementById(“button“) 就能找出位置,做觸發點擊按鈕的動作?
→ 不採用的主要原因是 : 文本內有多個相同id的資料,規定是只能一個,但也可例外,只是系統無法正確識別而已,必須使用排位順序(x)找出正確的id位置。)

[ 2 ] : 避免發生錯誤,就換個方式,來做搜尋,發現 <input> 標籤內的 value=”送出查詢 是唯一,就拿它來當關鍵值。
◎ 首先,先以 getElementsByTagName(“input“) 來定位抓取 input 標籤(Tag)裡面的資料。( PS. 但注意 input 標籤在文本裡面有很多個,所以先將其設定成為一個物件,將文本內所有 input 標籤裡面的內容,全裝進來,再一個一個作判別。)
◎ 設定語法 : Set A = IE.document.getElementsByTagName(“input”) ( ※ A物件 = 所有 input標籤 的集合。)

[ 3 ] : 運用 迴圈( For … Next ) 將 A物件裡面的 input標籤 一組一組搜尋。
◎ 迴圈公式 : For x = 0 To A.Length – 1 ( ※ 要了解的是 Length 的屬性,代表 : 數量;A.Length = 所有A物件裡面 input標籤 的集合數量。公式內 0 To A.Length – 1,因為由 0 開始,所以 A.Length – 1。 )

[ 4 ] : 運用 判別式( If … Then ) 指令,找出 value=”送出查詢,予以 按下(Click) 。
◎ 判別公式 : If A(x).Value = “送出查詢” Then A(x).Click ( ※ 這裡要注意的是 : 若 送出查詢 並不是唯一,就要增加判別條件,來做篩選的動作。)

[ 完成圖 – 台指期歷史交易資料 ] :


◎ 紅框內顯示 2023/04/13 (一般交易時段) 期貨契約的歷史交易行情。( PS. 這些就是我們要抓取的資料。)

台指期歷史交易資料 — 寫入 EXCEL

◎ 點擊了 “送出查詢“,系統就會將查詢日期的台指期歷史資料,顯示在螢幕下方。( 如:上圖 )

◎ 台指期歷史資料出現後,就可以著手抓取台指期各契約的交易資料,記得在前頭 [ 台股期貨(TX)行情表 對照圖 ] 裡,已經介紹 行情表內容資料 與 HTML 的對應位置。
VBA 網路爬蟲

爬取區段內容資料

[ 1 ] : 首先運用 工具,確定區段內容 — 日期 及其相關資料,對應HTML語法的位置。( 參考下圖 )


[ 2 ] : 由HTML語法中了解區段內容資料,被包覆在標籤名稱 : div / 屬性名稱 : id / 屬性值 : printhere 裡頭,日期及其相關資料,全都編排在一起,要將其取出,VBA語法為 : xWord = IE.document.getElementById(“printhere”).innerText,因要將內容資料拆分,所以先設定存放在 xWord 變數裡。

    [ 程式碼 / 拆分區段內容資料 ] :
    xWord = IE.document.getElementById("printhere").innerText
    [A1] = "日期": [A2] = Mid(xWord, 9, 10)
    [B1] = "名稱": [B2] = Mid(xWord, 25, 15)
    [C1] = "交易時段": [C2] = Mid(xWord, 42, 26)
    [D1] = "時段名稱": [D2] = Mid(xWord, 68, 6)

[ 3 ] : 有關文字拆分字串(Mid)指令的說明,這裡就不贅述。資料寫入Excel的情況,參考下圖。

爬取內容標題

[ 1 ] : 再來,同樣運用 工具,找出內容標題與內容資料的位置。此時,你會發現內容標題與資料,被包覆在 標籤名稱 : table / 屬性名稱 : class / 屬性值 : table_f 裡頭,而所有的標題與資料都是以 <tr> 標籤來做開頭(可以”“來認定),再來做分項的排列(就是”“),不同的是內容標題是以 <th> 來包覆,內容資料是用 <td>。 ( 參考 : 下圖 )


[ 2 ] : 了解以上包覆的概念,就可以轉化成 VBA公式,來抓取資料了。

    [ 程式碼 : 台指期行情表內容標題與資料 ] :
    Set xTBL1 = IE.document.getElementsByClassName("table_f")(0)
    Set xTR = xTBL1.getElementsByTagName("tr")
    For xRow = 0 To xTR.Length - 1 ' 執行迴圈 ( tr的標籤數量 ) -- 相當於 列。
            If xRow = 0 Then
                    Set xTH = xTR(xRow).getElementsByTagName("th")
                    For xCol = 0 To 14  ' 內容標題之欄位( 行 )。
                           Cells(3, xCol + 1) = xTH(xCol).innerText ' 列出 - 內容標題。
                    Next
            Else
                    Set xTD = xTR(xRow).getElementsByTagName("td")
                    For xCol = 0 To 14  ' 內容資料之欄位( 行 )。
                           Cells(xRow + 3, xCol + 1) = xTD(xCol).innerText ' 列出 - 內容資料。
                    Next
            End If
    Next

[ 網頁的資料結構 ] :
※ 首先要了解網頁的資料結構 — 表格( table ) 包含所有的列( tr ),每列包含若干單元格( td ),同時表格也可附加標題列( th ),用於定義行的標題。
[ tr ( table row 縮寫 ) ] : 意思是表格中的
[ td ( table data 縮寫 ) ] : 意思是表格中的資料儲存格。
[ th ( table header 縮寫 ) ] : 意思是表格中的標題儲存格。

[ 程式解說 ] :
[ A ] : Set xTBL1 = IE.document.getElementsByClassName(“table_f”)(0) : 首先,先設定最外層的 table_f ( 屬性名稱 : class ),將包覆在 table_f 的所有資料,設定給 xTBL1 物件變數。( PS. 為何會有 (0),因為有2組 table_f,台指期行情表在前面, 所以是 (0),若要抓取 價差行情表,就是 (1) 了。)

[ B ] : Set xTR = xTBL1.getElementsByTagName(“tr”) : 將所有在 xTBL1 變數裡,以 <tr> 標籤為開頭的資料細分出來,再運用 xTR.Length,就能知道有多少組 <tr> 的資料 。

[ C ] : For xRow = 0 To xTR.Length – 1 : 運用 迴圈( For … Next )指令,擷取出 xTR 物件裡一組一組的標籤資料。

[ D ] : If xRow = 0 Then : 意思是執行第一個迴圈( xRow = 0 )時,先執行內容標題的擷取動作。( PS. 參考對照圖 — 第一組 <tr> 就是內容標題的區段。)

[ E ] : Set xTH = xTR(xRow).getElementsByTagName(“th”) : 將包覆在 xTR(0) 的所有 <th> 標籤資料,設定給 xTH 物件。

[ F ] : For xCol = 0 To 14 : 同上作法,再以迴圈( For … Next )指令擷取一個個 <th> 資料。( PS. 為何是 : 14,其實是用算的,也可以使用 xTH.Length – 1。)

[ G ] : Cells(3, xCol + 1) = xTH(xCol).innerText : 從 A3 ( Cells(3, xCol + 1) ) 欄位開始,列出 xTH(0) 開始的 15 個標題資料。

[ H ] : Set xTD = xTR(xRow).getElementsByTagName(“td”) : 同上 xTH 的設定一樣。將包覆在 xTR(0) 的所有 <td> 標籤資料,設定給 xTD 物件。

[ I ] : Cells(xRow + 3, xCol + 1) = xTD(xCol).innerText : 從 A4 ( Cells(xRow + 3, xCol + 1) ) 欄位開始,列出 xTD(0) 開始的 15 個標題資料。

[ 期貨歷史交易資料 — 寫入EXCEL 完成圖 ] :

結束 操控IE

※ 程式開頭啟動 IE.Navigate URL 之後,便與IE瀏覽器建立連結,一旦程式執行完畢,不再使用,請務必將其關閉,才不會造成系統負擔。

[ 程式碼 - 切斷 IE 連線 ] : 
IE.Quit

清除所有 SET 設定

※ 程式結尾,請務必將程式中所有 SET 的設定值 清空,才不會造成系統負擔。

    [ 程式碼 / 清除 SET 設定 ] :
    Set IE = Nothing
    Set A = Nothing
    Set xTBL = Nothing 
    Set xTR = Nothing 
    Set xTH = Nothing
    Set xTD = Nothing

完整程式碼

Sub 期貨歷史資料抓取()

    Set IE = CreateObject("InternetExplorer.Application")  ' 使用IE操控物件
    my_url = "https://www.taifex.com.tw/cht/3/futDailyMarketReport"  '
    
    IE.Visible = True  ' 顯示IE網頁 / False : 不顯示IE網頁
    IE.Navigate my_url  ' 連線到證交所網址

    Do While IE.ReadyState <> 4 Or IE.Busy
        DoEvents
    Loop
    
    ' 若只抓取當日交易資料 -- 這段可以省略。
    IE.document.getElementById("queryDate").Value = "2023/04/13"  ' 查詢日期
    IE.document.getElementById("MarketCode").Value = "1"  ' 0 : 一般交易時段 / 1 : 盤後交易時段
    IE.document.getElementById("commodity_idt").Value = "TX"  ' TX : 台指期 / MTX : 小台指
    
    Application.Wait (Now + TimeValue("0:00:01"))  ' 等待網頁加載完成

    Set A = IE.document.getElementsByTagName("input")
    For x = 0 To A.Length - 1
        If A(x).Value = "送出查詢" Then A(x).Click  ' 因為文本只有一個 "送出查詢",無需再一個判別項目。
    Next
    
    xWord = IE.document.getElementById("printhere").innerText
    [A1] = "日期": [A2] = Mid(xWord, 9, 10)   ' 日期
    [B1] = "名稱": [B2] = Mid(xWord, 25, 15)
    [C1] = "交易時段": [C2] = Mid(xWord, 42, 26)
    [D1] = "時段名稱": [D2] = Mid(xWord, 68, 6)

    Set xTBL = IE.document.getElementsByClassName("table_f")(0)
    Set xTR = xTBL.getElementsByTagName("tr")

    For xRow = 0 To xTR.Length - 1 ' 執行迴圈 ( tr的標籤數量 ) -- 相當於 列。
            If xRow = 0 Then
                    Set xTH = xTR(xRow).getElementsByTagName("th")
                    For xCol = 0 To xTH.Length - 1  ' 內容標題之欄位( 15行 )。
                           Cells(3, xCol + 1) = xTH(xCol).innerText ' 列出 - 內容標題。
                    Next
            Else
                    Set xTD = xTR(xRow).getElementsByTagName("td")
                    For xCol = 0 To xTD.Length - 1  ' 內容資料之欄位( 15行 )。
                           Cells(xRow + 3, xCol + 1) = xTD(xCol).innerText ' 列出 - 內容資料。
                    Next
            End If
    Next

    IE.Quit  ' IE 切斷連線

    Set IE = Nothing
    Set A = Nothing
    Set xTBL = Nothing
    Set xTR = Nothing
    Set xTH = Nothing
    Set xTD = Nothing

End Sub

結論

※ VBA 網路爬蟲 是一個利用 VBA語言和 Excel功能,實現網路數據爬取的解決方案。

[ 優點 ] : 開發相對容易,能夠快速地進行數據爬取,並且方便地進行數據處理和分析,非常適用於需要從網路上抓取數據的應用需求。

[ 缺點 ] : 對於複雜的網頁結構和動態網頁支援較弱,可能無法完整地抓取所需的數據;其次,因為 VBA 是在 Excel 中運行,對於處理大量數據的能力較差,運行效率也相對較低,無法滿足高效率的應用需求。

綜上所述,VBA 網路爬蟲是一個便捷的網路數據爬取工具,適用於小規模、簡單的數據爬取任務,但在面對複雜、大量的網路數據時,就需要考慮使用更專業的網路爬取工具。

( PS. 如果喜歡 股小白 的文章,歡迎到 股小白臉書粉絲頁 點讚,衝個人氣,目前不定期分析大盤趨勢,將來會有 每日公報 : 分析並公布跑分的個股資料,讓大家作為投資參考。 )

關 聯 文 章

[ 0 ] : 網路爬蟲 – 操控IE,秒抓上市櫃公司財務報表
※ 財務報表 是評估一家公司財務健康狀況的重要工具。投資者可以透過學習財務概念,來理解報表中的數字,並利用網路爬蟲/操控IE的方式,擷取公開資訊觀測站的財務報表數據,將其導入EXCEL,計算出關鍵指標,進而研究和分析,再根據自身的風險承受能力和投資目標來做出買賣決策。

[ 1 ] : 操控IE – 秒抓資產負債表
※ 利用 操控IE 的方式,抓取 資產負債表 數據,再導入 Excel 進行公式計算,求得重要的指標資訊,便能清楚了解公司的 財務狀況和經營績效,並進一步研究和分析其商業模式、市場競爭力和投資風險。

[ 2 ] : 操控IE – 秒抓損益表
※ 利用 操控IE 的方式,抓取 損益表 數據,再導入 Excel 進行資料抓取,求得重要的指標資訊,便能清楚了解公司經濟表現的總體情況,可以幫助投資者和管理層更好地了解公司的財務狀況,制定相應的經營策略。

[ 3 ] : 操控IE – 秒抓現金流量表
※ 利用 操控IE 的方式,抓取 現金流量表 數據,再導入 Excel 進行計算和分析,從而瞭解該公司在 經營 / 投資 / 融資 的各種現金流量狀況,進而評估企業的財務狀況、經營現況和抵禦風險的能力。

[] : VBA 網路爬蟲 真簡單 – 爬取台指期歷史交易資料
※ VBA 網路爬蟲 是一個利用 VBA語言和 Excel功能,實現網路數據爬取的解決方案。文中以爬取「台指期歷史交易資料」做實例,一一講述如何透過IE操控的技巧,上網抓取台指期交易記錄,並將其資料寫入EXCEL,加以整合處理,進而歸檔分析。

V B A 資 源

EXCEL & VBA功能 – 綜合筆記
※ EXCEL & VBA功能 筆記 : 將針對文章中所使用的 EXCEL 及 VBA公式 / 工具操作 / 巨集設定 / 控制項的運用,做個整合記錄,方便大家在學習當下的參考與使用。

VBA指令 – 彙整筆記
※ VBA 提供相當多的指令用法,VBA指令 彙整筆記,將會陸續記錄 VBA文章 中,所用過的 VBA指令,方便學員們對照運用。

VBA程式語法 – 彙整筆記
※ 語法就是程式的文法。 使用者要與電腦溝通,就必須遵守這些規則。VBA程式語法 筆記 : 將針對 VBA文章 中所使用的 VBA程式語法,做個整合記錄,方便大家在學習當下參考與使用。