王蕾
[提要] 互聯(lián)網(wǎng)金融數(shù)據(jù)中潛藏著未知的知識(shí)價(jià)值,但也存在著巨量的數(shù)據(jù)冗余。通過Python可以進(jìn)行互聯(lián)網(wǎng)金融數(shù)據(jù)的獲取、解析、提取關(guān)鍵信息并進(jìn)行存儲(chǔ),其方式方法是靈活多樣的,可采用的開源庫也比較多。獲取數(shù)據(jù)時(shí)要遵守法律和道德規(guī)范,使用Python時(shí)可以依據(jù)實(shí)際的研究?jī)?nèi)容來決定需要采集的數(shù)據(jù)。Python是互聯(lián)網(wǎng)數(shù)據(jù)的獲取工具,也是進(jìn)行互聯(lián)網(wǎng)金融數(shù)據(jù)分析的基石。
關(guān)鍵詞:Python;互聯(lián)網(wǎng)金融;數(shù)據(jù)采集;數(shù)據(jù)解析
成果來源:河北省教育廳課題(QN2015151);保定市科技局課題(16ZF180);河北省智慧金融應(yīng)用技術(shù)研發(fā)中心課題(XZJ2017003);河北省科技廳軟科學(xué)研究計(jì)劃項(xiàng)目(17450903D)
中圖分類號(hào):F83 文獻(xiàn)標(biāo)識(shí)碼:A
收錄日期:2017年3月17日
伴隨著互聯(lián)網(wǎng)的發(fā)展與移動(dòng)應(yīng)用的普及,互聯(lián)網(wǎng)金融得到了長(zhǎng)足的發(fā)展,伴隨而來的是規(guī)模巨大的數(shù)據(jù),金融從業(yè)者要通過數(shù)據(jù)挖掘、大數(shù)據(jù)分析獲取有價(jià)值的信息,完成精準(zhǔn)營(yíng)銷,進(jìn)而降低營(yíng)銷成本,提高業(yè)績(jī)。這時(shí),一項(xiàng)重要的前置工作就是數(shù)據(jù)的采集,以便于后續(xù)的數(shù)據(jù)分析,尤其是實(shí)時(shí)數(shù)據(jù)分析。
一、互聯(lián)網(wǎng)金融數(shù)據(jù)來源
要進(jìn)行金融大數(shù)據(jù)分析,其數(shù)據(jù)來源可劃分為內(nèi)部數(shù)據(jù)來源和外部數(shù)據(jù)來源兩種。內(nèi)部數(shù)據(jù)來源是互聯(lián)網(wǎng)金融企業(yè)內(nèi)部數(shù)據(jù)庫,較易得到,但是數(shù)據(jù)庫中的數(shù)據(jù)往往不能直接用于分析,需要進(jìn)行數(shù)據(jù)整合、清洗和轉(zhuǎn)換等才能被使用。分析企業(yè)內(nèi)部數(shù)據(jù)可以較好地對(duì)客戶進(jìn)行細(xì)分、了解金融產(chǎn)品組合特點(diǎn),預(yù)測(cè)金融產(chǎn)品發(fā)展趨勢(shì),輔助進(jìn)行金融決策,但從了解整個(gè)行業(yè)的發(fā)展角度來講這并不夠,需用到外部金融數(shù)據(jù)。外部金融數(shù)據(jù)的來源有多種形式:一是通過與數(shù)據(jù)擁有方簽署合作協(xié)議來獲取所需金融數(shù)據(jù);二是購買金融數(shù)據(jù)庫等方式來獲取;三是通過數(shù)據(jù)采集工具來自行采集獲取。第三種數(shù)據(jù)采集方式的優(yōu)點(diǎn)是可以私人定制所需數(shù)據(jù),缺點(diǎn)是對(duì)技術(shù)要求較高,同時(shí)不能違反網(wǎng)絡(luò)數(shù)據(jù)采集的法律和相關(guān)道德約束,如應(yīng)當(dāng)遵守Robots Exclusion Protocol,否則可能會(huì)引發(fā)與“酷米客”與“車來了”之間數(shù)據(jù)糾紛類似的法律事件、產(chǎn)生隱私數(shù)據(jù)泄露、影響服務(wù)器性能等一系列問題。
二、互聯(lián)網(wǎng)金融數(shù)據(jù)的分類
在利用數(shù)據(jù)采集工具自行采集互聯(lián)網(wǎng)金融數(shù)據(jù)時(shí)會(huì)遇到多種類別的數(shù)據(jù)。按照行業(yè)領(lǐng)域劃分,包括股票、證券、債券、期貨等理財(cái)數(shù)據(jù),P2P數(shù)據(jù),眾籌數(shù)據(jù),電子商務(wù)數(shù)據(jù),微博、微信、貼吧等社交平臺(tái)互聯(lián)網(wǎng)金融評(píng)論數(shù)據(jù),新聞財(cái)經(jīng)數(shù)據(jù)等。從數(shù)據(jù)自身的結(jié)構(gòu)類型角度進(jìn)行劃分,包括數(shù)字、短文本、長(zhǎng)文本、圖片、音頻、視頻等。日期、價(jià)格、指數(shù)等多為數(shù)字或者短文本,評(píng)論、新聞等多為長(zhǎng)文本,圖片、音頻、視頻等隨著通訊技術(shù)和互聯(lián)網(wǎng)金融的發(fā)展也將成為互聯(lián)網(wǎng)金融數(shù)據(jù)的重要來源。
三、互聯(lián)網(wǎng)數(shù)據(jù)采集手段
針對(duì)上述外部數(shù)據(jù)采集中的第三種數(shù)據(jù)采集方式,即通過數(shù)據(jù)采集工具自行采集互聯(lián)網(wǎng)數(shù)據(jù)的手段進(jìn)行探討。互聯(lián)網(wǎng)數(shù)據(jù)的采集可采用網(wǎng)絡(luò)爬蟲,又稱網(wǎng)頁蜘蛛或網(wǎng)絡(luò)機(jī)器人,其按照一定的規(guī)則,自動(dòng)地抓取來自網(wǎng)絡(luò)的程序或腳本。指定URL并不斷從當(dāng)前頁面上抽取新的URL放入隊(duì)列,直到滿足一定的停止條件。網(wǎng)絡(luò)爬蟲在訪問一個(gè)超文本鏈接時(shí),可以從HTML標(biāo)簽中自動(dòng)獲取指向其他網(wǎng)頁的地址信息,其間可依據(jù)關(guān)鍵詞對(duì)所有相關(guān)網(wǎng)頁信息進(jìn)行存貯、解析和存儲(chǔ)。常用的爬蟲策略包括深度優(yōu)先搜索策略、廣度優(yōu)先搜索策略和最佳優(yōu)先搜索策略。頁面內(nèi)容和鏈接的重要性的不同會(huì)導(dǎo)致鏈接訪問順序的不同,其重要性評(píng)價(jià)方式包括基于內(nèi)容評(píng)價(jià)、基于鏈接結(jié)構(gòu)評(píng)價(jià)、基于增強(qiáng)學(xué)習(xí)和基于語境圖的爬行等。
四、基于Python的金融數(shù)據(jù)采集
C++、C#、Java、Python等程序設(shè)計(jì)語言都可以作為網(wǎng)絡(luò)爬蟲的開發(fā)語言來進(jìn)行互聯(lián)網(wǎng)金融數(shù)據(jù)的采集。Python作為一種開源語言提供了豐富的API和工具,可以使用C語言、C++等來編寫擴(kuò)充模塊,也可以使用第三方庫,具有較高的靈活性,故采用Python來進(jìn)行互聯(lián)網(wǎng)金融數(shù)據(jù)的采集。在使用Python進(jìn)行數(shù)據(jù)采集時(shí),如果是小規(guī)模數(shù)據(jù)采集,可以使用requests+Beautiful Soup+re的架構(gòu)來完成,使用requests庫可以自動(dòng)提交網(wǎng)絡(luò)請(qǐng)求和自動(dòng)爬取HTML頁面,使用Beautiful Soup庫和re正則表達(dá)式可解析HTML頁面和提取頁面關(guān)鍵信息;如果是較大規(guī)模數(shù)據(jù)的采集則可使用scraper架構(gòu)或者Portia架構(gòu)來完成。下面進(jìn)行互聯(lián)網(wǎng)金融數(shù)據(jù)采集的實(shí)證分析,針對(duì)淘寶網(wǎng)站的“大碼女裝”銷售情況進(jìn)行分析,需要獲取商品名稱、價(jià)格、銷售量、產(chǎn)地、商家等信息。首先應(yīng)查看其網(wǎng)站根目錄之下的robots.txt文件,以得知該網(wǎng)站通過爬蟲來獲取數(shù)據(jù)時(shí)有哪些限制。接下來制定搜索策略,獲取HTML頁面信息,解析HTML文檔,提取商品名稱、價(jià)格、銷售量等關(guān)鍵信息,最后存儲(chǔ)商品信息。
(一)搜索策略的確定。以某URL為入口,分析最終URL隊(duì)列形成方式以確定搜索策略。分析發(fā)現(xiàn),其檢索結(jié)果被放置于具有頁碼的多個(gè)頁面,觀察其URL所具備的特點(diǎn)http://s.taobao.com/search?q=”大碼女裝”&s=頁碼*每頁商品顯示數(shù)量,鑒于此可以確定此商品URL隊(duì)列的獲取原則。循環(huán)遍歷次數(shù)為頁面數(shù)量或自定義數(shù)量,為了不造成對(duì)網(wǎng)站服務(wù)器的負(fù)擔(dān),模擬了人類的訪問頻率,每獲取一個(gè)頁面信息,隨即進(jìn)行解析和存儲(chǔ)并休眠2秒。try-catch處理了異常,提高了程序的健壯性。確定搜索策略后就要遍歷得到頁面信息。每次遍歷實(shí)現(xiàn)對(duì)單個(gè)HTML頁面信息的獲取、解析和存儲(chǔ)。頁面信息的獲取調(diào)用了自定義方法getHTML(),頁面信息的解析調(diào)用了自定義方法parseHTML()。核心代碼如下所示:
for i in range(頁面數(shù)量):
time.sleep(2)
try:
url=start_url+str(每頁商品數(shù)量*i)
html=getHTML(url)
parseHTML(html,goodslist)
saveGoodsList(goodslist,file_path)
except:
continue
(二)獲取HTML頁面信息。獲取HTML頁面信息需要獲取HTML頁面的源代碼,可以調(diào)用requests庫的get(url)方法,此方法是獲取網(wǎng)頁的常用方法之一,url作為其參數(shù)指明了要獲取的資源路徑,返回的頁面信息被存儲(chǔ)為Response對(duì)象中。Response對(duì)象的text即為HTML的頁面內(nèi)容。requests還包括post()、head()等方法。使用requests.get(url).text可以獲得url地址所對(duì)應(yīng)的HTML文檔內(nèi)容;使用f.write(requests.get(url).content)可以將url所指向資源以二進(jìn)制的形式獲得并保存至本地電腦,該資源可以是文本、圖片、音頻、視頻等。以下為getHTML()方法中部分代碼:
r=requests.get(url,header,timeout=30)
return r.text
(三)解析HTML文檔,提取關(guān)鍵信息。獲取頁面信息后,就要對(duì)HTML頁面內(nèi)容進(jìn)行分析以提取關(guān)鍵信息。整個(gè)解析過程中要對(duì)HTTP協(xié)議及HTML文檔結(jié)構(gòu)有足夠的認(rèn)識(shí)。當(dāng)前要獲取的是商品名稱、價(jià)格、銷售量、產(chǎn)地、商家等信息,分析HTML頁面源代碼發(fā)現(xiàn)其結(jié)構(gòu)如下:
"raw_title":"2017胖妹妹春裝***韓版寬松"
"view_price":"139.00"
"view_sales":"1245人付款"
"nick":"西加索旗艦店"
"item_loc":"廣東 廣州"
可以使用正則表達(dá)式直接提取,正則表達(dá)式是一個(gè)特殊的字符序列,它能方便地檢查一個(gè)字符串是否與某種模式匹配。re庫是python的標(biāo)準(zhǔn)庫,主要用于字符串匹配。re的findall()可以實(shí)現(xiàn)在文本中檢索全部能匹配的字符子串,并將檢索結(jié)果以列表類型返回。re還包括search()、match()、split()等方法。通過salelt=re.findall(r'\"view_sales\"\:\"[\d].*?\"',html)方法可以從html中將所有匹配r'\"view_sales\"\:\"[\d].*?\"'格式的文本檢索出來并放于salelt當(dāng)中。這時(shí)就形成商品銷售量的列表["view_sales":"40人付款","view_sales":"**人付款","view_sales":"**人付款"……]。其他信息如商品名稱、價(jià)格、產(chǎn)地、商家等獲取方式類似,更改匹配原則即可。
但是,此時(shí)還需要去除無關(guān)文本,形成每件商品的記錄。當(dāng)前有pricelt、salelt、nicklt、locallt等多個(gè)列表,可以逐個(gè)獲取列表中的信息,形成每件商品信息,然后再將商品信息依次放入商品信息列表goodslist當(dāng)中。sale=eval(salelt[i].split(':')[1]).strip('人付款')實(shí)現(xiàn)了從"view_sales":"**人付款"結(jié)構(gòu)中獲取銷售量,其中salelt[i].split(':')[1]獲取到'**人付款',strip()去除了多余字符串'人付款'。goodslist.append([price,sale,nick,……])實(shí)現(xiàn)了將一件商品信息的價(jià)格、銷售量、商家、產(chǎn)地等多項(xiàng)信息放入goodslist。For循環(huán)中append方法的使用使得所有商品信息依次放入goodslist。核心代碼如下:
for i in range(len(salelt):
try:
price=eval(pricelt[i].split(':')[1])
sale=eval(salelt[i].split(':')[1]).strip('人付款')
……
goodslist.append([price,sale,nick,……)
except:
continue
(四)商品信息的存儲(chǔ)。頁面解析結(jié)束后就要對(duì)商品信息進(jìn)行存儲(chǔ)以便于進(jìn)一步進(jìn)行數(shù)據(jù)分析。數(shù)據(jù)存儲(chǔ)時(shí)可以依據(jù)數(shù)據(jù)特點(diǎn)將其存儲(chǔ)為CSV、EXCEL、XML等格式化文本,存儲(chǔ)到SQL Server、MySQL、Oracle等關(guān)系型數(shù)據(jù)庫,存儲(chǔ)到MongoDB、Redis等非關(guān)系型數(shù)據(jù)庫,或者進(jìn)行數(shù)據(jù)索引存儲(chǔ)等。此處存儲(chǔ)為CSV格式,它是以純文本形式存儲(chǔ)表格數(shù)據(jù),以逗號(hào)或制表符等為每條記錄字段間的分隔符,所有記錄具有相同的字段序列,具有方便導(dǎo)入Excel或數(shù)據(jù)庫的特點(diǎn)。以文件續(xù)寫的方式打開文件,為防止亂碼的出現(xiàn),編碼方式設(shè)置為gb2312,因?yàn)樯唐沸畔⒘斜韌oodslist中每一項(xiàng)仍為列表,故采用f.write(",".join(goods)+"\n")方式進(jìn)行了寫入。核心代碼如下:
with open(“D://info.csv“,"a",encoding='gb2312')as f:
for goods in goodslist:
f.write(",".join(goods)+"\n")
(五)采集結(jié)果分析。最終采集數(shù)據(jù)放于info.csv中,如表1所示。采集結(jié)果與原始頁面進(jìn)行對(duì)比,發(fā)現(xiàn)其具有正確的對(duì)應(yīng)關(guān)系。與使用人工來獲取信息對(duì)比,使用python來獲取數(shù)據(jù)具有同等或者說更高的準(zhǔn)確性,速度更快,大大節(jié)省了時(shí)間與人力。(表1)
主要參考文獻(xiàn):
[1]劉艷平,俞海英,戎沁.Python模擬登錄網(wǎng)站并抓取網(wǎng)頁的方法[J].微型電腦應(yīng)用,2015.
[2]齊鵬,李隱峰,宋玉偉.基于Python的Web數(shù)據(jù)采集技術(shù)[J].電子科技,2012.
[3]蘭秋軍.互聯(lián)網(wǎng)金融數(shù)據(jù)抓取方法研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2011.
[4]陳琳.基于Python的新浪微博數(shù)據(jù)爬蟲程序設(shè)計(jì)[J].信息系統(tǒng)工程,2016.