有時(shí)我們常常需要保存?zhèn)浞菽承┚W(wǎng)上的數(shù)據(jù),如銀行利率,股票行情,抑或統(tǒng)計(jì)局、各種金融機(jī)構(gòu)或其他類型網(wǎng)站的數(shù)據(jù)。 有時(shí)這些網(wǎng)站會(huì)提供歷史數(shù)據(jù),有的則不會(huì)。但是我們可以通過(guò)SAS每天跑下程序獲取累積歷史數(shù)據(jù)作為后來(lái)的分析之用,F(xiàn)在我拿獲取 http://www.shibor.org/ 主頁(yè),上海銀行間同業(yè)拆放利率,作為案例進(jìn)行演示。
以下為主頁(yè)上我們想要的數(shù)據(jù)當(dāng)我們打開(kāi)此網(wǎng)頁(yè),并進(jìn)到網(wǎng)頁(yè)源碼中時(shí),我們會(huì)驚訝的發(fā)現(xiàn)。什么情況,在主頁(yè)上看到的數(shù)據(jù)在源碼里找不到,難道使用了別的技術(shù)。我們大概瀏覽一下源碼所表示的
網(wǎng)頁(yè)布局。
按網(wǎng)頁(yè)布局來(lái)說(shuō),一大坨文字的后面就應(yīng)該放最新Shibor數(shù)據(jù)的源碼,而他放了一句。
<iframe scrolling="no" src ="/shibor/web/html/shibor.html" width="377" height="473" frameborder="0" name="shibordata"></iframe>這是html內(nèi)聯(lián)框架結(jié)構(gòu),就是說(shuō)他把數(shù)據(jù)放另一個(gè)網(wǎng)頁(yè)上了,然后把這個(gè)網(wǎng)頁(yè)嵌在主頁(yè)里。好,那我們就打開(kāi)此網(wǎng)頁(yè)
http://www.shibor.org/shibor/web/html/shibor.html并查看源碼,發(fā)現(xiàn)數(shù)據(jù)就存在此網(wǎng)頁(yè)中,那我們就開(kāi)始用SAS抓它一下。
高潮首先介紹下Filename,利用它加上infile語(yǔ)句就可以把網(wǎng)頁(yè)當(dāng)成文件導(dǎo)入SAS數(shù)據(jù)集。 The FILENAME Statement (URL Access Method) in Base SAS, enables users to access the source code from a web site and read it into a data set. The syntax for this statement is:
FILENAME fileref URL 'external-file'<url-options>;- 數(shù)據(jù)導(dǎo)入
把Shibor數(shù)據(jù)網(wǎng)頁(yè)導(dǎo)入SAS數(shù)據(jù)集。我們知道網(wǎng)頁(yè)數(shù)據(jù)是標(biāo)記語(yǔ)言,服從一定規(guī)范,所有屬性設(shè)置都被<>包含。所以我們利用dlm=">"把它分隔導(dǎo)入到一個(gè)變量中, 因?yàn)閿?shù)據(jù)太亂,我們沒(méi)法分清使之導(dǎo)入到不同變量。
FILENAME SOURCE URL "%STR(http://www.shibor.org/shibor/web/html/shibor.html)" DEBUG;DATA Zhaocl01; FORMAT WEBPAGE $1000.; INFILE SOURCE LRECL=32767 DELIMITER=">"; INPUT WEBPAGE $ @@;RUN;- 數(shù)據(jù)清洗
因?yàn)槲覀兝昧薲lm=">"進(jìn)行了分隔,所以我們清楚收集到的觀測(cè)值只要以<開(kāi)頭就說(shuō)明這條觀測(cè)只有設(shè)置語(yǔ)言,沒(méi)有我們想要的數(shù)據(jù)。而我們真正要要的數(shù)據(jù)肯 定都在<標(biāo)識(shí)符的前面。因?yàn)樵诰W(wǎng)頁(yè)源碼中會(huì)用  代表空格,&代表連字符,所以把他們進(jìn)行替換。
DATA Zhaocl02; SET Zhaocl01; WHERE WEBPAGE LIKE "_%<%"; /**刪除以<開(kāi)頭的觀測(cè)**/ TEXT=SUBSTRN(WEBPAGE,1,FIND(WEBPAGE,"<")-1); /**提取<前面的字符串**/ TEXT=TRANWRD(TEXT,"%NRSTR( )"," "); TEXT=TRANWRD(TEXT,"%NRSTR(&)","&"); IF ANYALPHA(TEXT) + ANYDIGIT(TEXT) LT 1 THEN DELETE; /**保留有效觀測(cè)**/ KEEP TEXT;RUN;結(jié)局- 結(jié)果展現(xiàn)
拿到了清理后的數(shù)據(jù)集,打開(kāi)看下已經(jīng)很清楚了。我們只要再做下最后簡(jiǎn)單的加工就好了。注意,由于網(wǎng)頁(yè)布局的變動(dòng)這段程序也可能要隨之稍加修改。
data Zhaocl03; set Zhaocl02; set Zhaocl02(firstobs=2 rename=(text=next1)); set Zhaocl02(firstobs=3 rename=(text=next2)); if text in ("O/N","1W","2W","1M","3M","6M","9M","1Y"); label text='期限' next1='Shibor(%)' next2='漲跌(BP)'; run; proc print label;run;其他正則表達(dá)式
在處理網(wǎng)頁(yè)數(shù)據(jù)時(shí),有一個(gè)利器就是正則表達(dá)式,威力巨大。比如:
prxchange("s/<.+?>//",-1,WEBPAGE );就可以去除所有<>包含的內(nèi)容。但是一定要在對(duì)自己獲取數(shù)據(jù)了解十分透徹的情況下使用,以防遺漏重要信息。
(轉(zhuǎn))