2017年1月26日 星期四

輕鬆用VBA做網路爬蟲(中)之 字串處理

字串處理(String Parsing)簡單說就是將一堆文字(包括符號、數字等)清理、整理後擷取我們需要的部份;以輕鬆用VBA做網路爬蟲(上) 最後的小挑戰做例子的話,可以(跟面試官)說我們是在開發處理玩股網報價的演算法


開發一個網路爬蟲時,大概有八成以上的時間都在做字串處理,

在這篇文章中我會用網路爬蟲“上篇”中最後的小挑戰作為例子,

再用一個線上的字庫讓大家練習一下。


上一篇文章中我們抓下來的原始資料長這樣:

200.32▲3.861.96%
108.47▲2.011.89%
134.03▲2.41.82%
130.71▲2.341.82%
113.09▲1.861.67%
82.59▲1.161.42%
208.67▲2.581.25%
160.88▲1.941.22%
484.47▲5.691.19%
380.09▲4.31.14%
263.25▲2.921.12%

首先,我們在被證明錯誤前先找找其中自以為的規律:「

1. 指數報價一定都到小數點後兩位;
2. 指數報價後會跟著上漲▲或下跌▼的符號,平盤時沒有符號(某天看見的);
3. 當天漲跌(有負號)一定都到小數點兩位,平盤時為0(某天看見的);
4. 不論當天漲跌(有負號),漲跌幅一定到小數點後兩位(eg. x.xx%)。」

因此,萃取指數報價的方式就是:「

找到第一個"."的位置(假設為n),然後抓第1位~第n+2位,
也就是 Left( 原始資料, inStr( 1, 原始資料, "." )+2 )。」


再來,萃取指數漲跌的方法稍微複雜點:「

【先看原始資料中是否有那兩個符號,有的話:「

首先,我們知道指數報價的結尾在n+2處,
因此我們新創一個從n+3開始的資料叫做"改動資料",
改動資料= Right( 原始資料, (len( 原始資料) -(n+2)) ),

所以,我們一樣找改動資料中第一個"."的位置(假設為m),然後抓第1位~第m+2位就行了,
也就是 Left( 改動資料, inStr( 1, 改動資料, "." )+2 )。

如果找不到▲或▼的符號,那當日漲跌就是0了。】」


最後是當日漲跌幅:「

如果當日漲跌不為0,那麼改動資料的第m+3位~最後一位就是漲跌幅了,
也就是Right( 改動資料, (len( 改動資料) -(m+2)) )。

當日漲跌為0的話,漲跌幅自然也為0( 0.00%)了。」


========================================================

以下是另一個字串處理+網路爬蟲的例子

========================================================


這是一個古登堡計畫下的字庫網頁(A開頭):
http://www.mso.anu.edu.au/~ralph/OPTED/v003/wb1913_a.html


我們要嘗試著計算出A開頭字庫中各種詞性(part of speech)佔的數目,
原始碼大致上長這樣子:「

<P><B>Abacinate</B> (<I>v. t.</I>) To blind by a red-hot metal plate held before the eyes.</P>
<P><B>Abacination</B> (<I>n.</I>) The act of abacinating.</P>
 <P><B>Abstaining</B> (<I>p. pr. & vb. n.</I>) of Abstain</P>  」

單字被<B>標籤包住、詞性則被<I>標籤包住,
除此之外一個單字可能會有多個詞性(在<I>標籤裡面被&符號分開)。
(註:實作後才發現有極少數的多詞性會被“ /” 以及“ ,” 符號分開)

爬蟲的前置除了網址不一樣外,其它的與上篇文章都一樣,
以下是抓取詞性的code:「

圖1:
















圖2:



























圖3:





















理論上,運行完後我們得到的資料大概會長這樣(部份):

Part of Speech
numbers
prep.
70
n.
5444
a.
2861
v.t.
1088
adv.
574
pl.
239
p.p.
317
imp.
287
p.pr.
285
vb.n.
285
v.
67
v.i.
278
n.pl.
171
superl.
10
i.
44
p.a.
7
a
2
interj.
15
p.p.Adored(/);p.pr.
1
a.superl.
2
Aprefix.
3
conj.
26
網路爬蟲中,字串處理的部份大致上就是這個樣子。

以下是範例檔案(附code):


字串處理是一門相當重要的功夫,
無論是做資料分析、語意分析、或甚至要暴力破解某個密碼都會用到它,
而有些問題只有在實作後才會被發現,
建議大家多多找出生活、工作中可以被自動化的工作,試著動手開發。

有任何問題歡迎來信或者留言,
如果想自動化一件工作卻毫無頭緒也可以來信我們討論看看,



IT'S   ALL   FREE !!






1 則留言: