2017年1月17日 星期二

輕鬆用VBA做網路爬蟲(上)

網路爬蟲(Web Crawler)簡單來說就是自動化的從網路上抓取我們要的資料,通常需要懂一些基礎的HTML語言以及還不賴的字串處理能力。


因為大部份網路爬蟲的相關來信都是想知道怎麼抓類/個股資料,

因此在這一系列的教學當中,我會從0到1教各位怎麼用VBA打造自己的股票資訊更新程式。

先介紹一下HTML,它的全名是Hyper Text Markup Language,
(註:本人極度不擅長HTML,若文章有錯請不吝嚴厲的來信或是在下面留言)
中國的翻譯是超文本標記語言,
在接下來的課程中我們會學著怎麼找到我們要的標記,然後用程式抓下來。
以下是一些標記(markup// tag)的例子:
标签描述
<!--...-->定义注释。
<!DOCTYPE>定义文档类型。
<a>定义锚。
<abbr>定义缩写。
<acronym>定义只取首字母的缩写。
<address>定义文档作者或拥有者的联系信息。
<applet>不赞成使用。定义嵌入的 applet。


因為Yahoo股市實在是太主流了,我決定用玩股網當做本系列的例子。
這是我們的目標網址:
在本篇文章中,我們會抓下這個頁面的:類股名稱、指數、漲跌、以及漲跌幅。


首先我們進到上述的網址,花個幾分鐘看看我們要的資料長什麼樣子,
再花一點時間看看網頁原始碼(source code)長什麼樣子(點右鍵通常就看得到這個功能了),
接著我們發現我們要的資料被一些東西包了起來,就像我的肝一樣。

==========================以玻璃作為例子==========================

<em class="qIdxName"><a href="/Stock/TWStock/ClassCont?id=^019">玻璃</a></em>
<p class="qIdx ig up">36.46<span class="qIdxChg">▲1.52<b>4.35%</b></span></p>

==========================以玻璃作為例子==========================

接下來很重要,我們要決定怎麼有效率的抽出(extract)我們要的資料,
以"玻璃"這個產業類別作為例子,
我們發現它被三個東西包住:<em>的標籤、qIdxName的類別名稱、以及<a>的標籤
但是綜觀整個source code,我們發現<a>標籤包含了太多我們不要的資訊了,
相對的<em>這個標籤只用來包住產業別而已,qIdxName這個名稱也是,
二選一,<em>比較短我就選它了;

然後我們發現指數、漲跌、漲跌幅通通混在一起分不開,
還好<p>標籤在整個原始碼當中幾乎只被用來記錄這些資訊,
所以我們就把這串東西一次抽出,之後再想辦法分開吧。



接下來該VBA上場了。

(註:本文最下方會附上範例資料)

設定完開發環境後,以下是加上附註的程式碼。
(不知道怎麼設定的朋友請看一下前文或是下載我的講義 https://goo.gl/9qtTiv)

圖片1:

圖片2:

















運行以上的程式碼後,我們應該可以在excel上看到下面的結果:
(如果沒有的話,建議objIE.visible改成True,看過程中是不是IE有什麼問題)
圖片3:
















為了拆開後面那一串東西,這裡介紹五個函式:『

第一個是inStr;inStr(起始位置,母字串,要找的字);
inStr(1, "My name is Tamio", "a")會產出5(空格也算一個字)。

第二個是inStrRev;inStrRev(母字串,要找的字);
inStrRev( "My name is Tamio", "a")會產出13(找後面數回去的第一個a)。

第三個是Left;Left(母字串,字數);
Left( "My name is Tamio", 6)會產出"My nam"。

第四個是Right;Right(母字串,字數);
Right( "My name is Tamio", 7)會產出"s Tamio"。

第五個是Mid;Mid(母字串,起始點,長度);
Mid( "My name is Tamio", 5, 5)會產出" ame i"。』

至於實務上要怎麼拆開那串東西,就留給大家做做看吧!
(文末我的範例檔案裡面有解法)

兩個提示:
1. 漲跌幅的格式幾乎都是x.xx%
2. 除了當日漲跌為0以外,都會有▲或是▼的符號,而指數一定落在這些符號之前


完成後應該長這樣子,
圖片4:















在下一篇文章中,
我會說明怎麼用VBA“點擊”產業類別的連結,
然後把裡面的資訊分門別類儲存起來。
圖片5:





















以下附上我的範例檔案:
https://goo.gl/D112gl

如果有問題歡迎留言或是在FB上msg我。



P.S. 搞不懂什麼時候要加Set、記不起來那麼多函式、
老是要google才知道一個功能該怎麼實現都是正常的,
寫這篇文章我也google的要死要活,請大家不要沮喪氣餒,
寫久了就會多記得一點點。

P.S.S. 寫這篇文章我參考了不少這系列影片的內容:
https://goo.gl/n4SeFS 」,英文不太好的人可以看看練習一下。

P.S.S.S. 我花了很多時間還是沒辦法把文章中的所有圖片大小變得一致,
不曉得跟陸客不來有沒有關係,請大家多多海涵~





1 則留言:

  1. 請問如果唔用ie ,改用firefox 或chrome, 應該點寫
    因為好多網頁ie 匯入唔到
    thanks

    回覆刪除