2021年3月14日 星期日

蝦咪! VBA網頁爬蟲也能用Xpath抓資料!!?

今天我們要講解的是,如何使用VBA+網頁XPath來抓取GoodInfo股票資訊

VBA使用的套件為MSXML2.XMLHTTP、與HTMLFile

MSXML2.XMLHTTP可以幫助我們進行網頁連線並取得內容

HTMLFile能夠利用網頁元件ID取得網頁資料

另外我們還自己寫了一些函數,將網頁標籤階層轉為Xpath ID,以便HTMLFile提取資料

今天要抓取的標的一樣是大立光,股票代號3008,

首先抓取公司名稱與產業別,這邊使用MSXML2.XMLHTTP進行網頁連線,並等待連線完成

連線完成後,呼叫函數進行解析,並使用Xpath ID取出資料

接著來抓取股利政策,一樣使用MSXML2.XMLHTTP進行網頁連線,並等待連線完成

由於表格某些資料佔用不只一欄或一列

所以我們必須先計算表格的欄數與列數

並且手動補齊,避免標頭有空白資料的狀況

再來設定要抓取的資料

找出資料欄位的索引值

最後取得表格的內容

接著抓取獲利狀況,首先使用MSXML2.XMLHTTP進行網頁連線,並等待連線完成

先計算表格的欄數與列數

補齊標頭資料

設定要抓取的資料

找出資料欄位的索引值

最後取得表格內容

最後來介紹我們寫的幾個簡單的函數

Prefix_Start作用是遇到標籤起頭將階層ID增加一層,並決定陣列索引

比如html開始的語句<html lang="zh-Hant">會被新增一個 id='/html[1]/' 屬性

如果這一次的階層(strPrefix)跟前一次的階層(strLastPreFix)為同一階層,我們會把前一次階層陣列的索引值取出加1後,指定給這次的陣列索引

前一次div陣列索引為1,這一次div陣列索引就增加為2

在解析股利政策時,我們有遇到兩個table中間插入一個div的狀況,所以需要多做一個從頭判斷ID有沒有曾經出現過,如果有索引就不是從1開始



Prefix_Finish作用是遇到標籤結尾將階層ID回推一層

如果發現是標籤結尾,往前找/後截斷字串,將階層回推一層


Parse_Html主要的工作就是判斷是否為標籤頭尾,如果是我們要的就進行處理


我們鎖定的標籤為html, body, div, table, thread, tr, td這些Xpath所需要的

在處理公司名稱時,遇到網頁原始碼中有一些問題,會讓我們的解析錯誤,上面的是單引號不匹配,下面的則是前一個<tr>沒有使用</tr>做結尾,就進入下一個<tr>



如果要自行解析Html,遇到問題時,建議使用下列網址,先檢測網頁原始碼http://validator.w3.org/

最後我們來看一下Get_Html_ID,這個函數功能是將Xpath節點名稱,加工為需要的ID

不需要的tbody被我們移除,沒有索引的標籤被加入[1]的陣列索引



教學與操作影片



0 意見:

張貼留言

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Blogger Templates