春雨 王宇棟
摘要:隨著股票/期貨市場的快速發(fā)展,股票/期貨相關(guān)數(shù)據(jù)的獲取是第一個需要解決的問題。通過API調(diào)用來獲取數(shù)據(jù)能優(yōu)化數(shù)據(jù)獲取流程,節(jié)約數(shù)據(jù)獲取時間。文章基于股票/期貨API的滬深港股票/期貨交易數(shù)據(jù)調(diào)用方法,分析對比其與網(wǎng)絡(luò)爬蟲數(shù)據(jù)調(diào)用方法的異同。由于單獨使用網(wǎng)絡(luò)爬蟲或API調(diào)用不能完成數(shù)據(jù)準(zhǔn)確完整的調(diào)用。因此,提出一種API調(diào)用和網(wǎng)絡(luò)爬蟲相結(jié)合的方法,從而解決API調(diào)用數(shù)據(jù)次數(shù)受限,網(wǎng)絡(luò)爬蟲調(diào)用數(shù)據(jù)過程復(fù)雜等問題,綜合兩種方法的優(yōu)點以實現(xiàn)數(shù)據(jù)高效完整的獲取。
關(guān)鍵詞:API;API調(diào)用;數(shù)據(jù)獲取;網(wǎng)絡(luò)爬蟲
19世紀(jì)70年代,Digital Research公司創(chuàng)造出了世界上第一個實用的軟件API(Application Programming Interface,應(yīng)用程序接口),這個API僅僅由20種簡單的函數(shù)組成,但就是這個API的出現(xiàn)改變了整個計算機(jī)領(lǐng)域。之后比爾·蓋茨等人復(fù)制了其API開發(fā)出MS-DOS操作系統(tǒng),添加了一些簡單的特性之后,將其推上了軟件開發(fā)的主導(dǎo)地位。
1981年,微軟公司發(fā)布Windows操作系統(tǒng),但其自己開發(fā)出來的Windows API不能滿足當(dāng)時使用需求,大量的開發(fā)人員投入到Windows程序的開發(fā)中來,同時加快了API的發(fā)展進(jìn)程。
1988年,微軟公司購買了Alan Cooper開發(fā)的可視編程語言:Ruby。Ruby滿足了名為VBX的軟件API,這種API可以讓開發(fā)人員動態(tài)地擴(kuò)展Visual Basic功能。
除了微軟之外,Unix世界也創(chuàng)造出可以在網(wǎng)絡(luò)之間自由通信的API,這就是TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協(xié)議/網(wǎng)際協(xié)議)。到了20世紀(jì)90年代,Marc Andreessen推出了世界上第一個Web瀏覽器:Mosaic。正是因為有了TCP/IP API,Netscape可以在自己的計算機(jī)之外查找其他網(wǎng)絡(luò)上的計算機(jī),并且提取其中的文件。
今天的軟件開發(fā)者很大一部分是在開發(fā)Web應(yīng)用程序, Web領(lǐng)域的開發(fā)者們不會對Web本身有太多的研究,所以這些開發(fā)者需要把其他開發(fā)者預(yù)先編寫的部分組合起來,所以他們比以前更多地依賴于為其編寫的軟件API。同時API在金融領(lǐng)域也發(fā)揮著它的優(yōu)勢。由于互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,股票/期貨的交易數(shù)據(jù)也呈現(xiàn)著快速增長的趨勢。目前大量股票/期貨交易數(shù)據(jù)為政府、組織機(jī)構(gòu)、企業(yè)所擁有,但是社會層面對股票/期貨交易數(shù)據(jù)的需求也越來越強(qiáng)烈,越來越多的團(tuán)體或個人需要按照自己的交易習(xí)慣定置個性化交易軟件。股票/期貨交易數(shù)據(jù)的獲取量大、股票/期貨數(shù)據(jù)更新頻繁、數(shù)據(jù)傳播迅速,并且數(shù)據(jù)獲取用戶相對集中,所以用API來調(diào)用股票/期貨數(shù)據(jù)既滿足了用戶對股票/期貨數(shù)據(jù)的需求同時還節(jié)省了數(shù)據(jù)獲取時間。
一、API概述
API是指操作系統(tǒng)預(yù)先把這些復(fù)雜的操作寫在一個函數(shù)里面,編譯成一個動態(tài)鏈接庫,跟隨操作系統(tǒng)一起發(fā)布,并附上使用文檔說明,使用者只需要簡單地調(diào)用這些函數(shù)就可以完成一些復(fù)雜的工作。API具有以下性質(zhì),一是可用性,是指用戶能否便捷運用API來完成指定任務(wù),是衡量API質(zhì)量的重要指標(biāo)。二是穩(wěn)定性,代表著API的質(zhì)量,穩(wěn)定的API可以提高調(diào)用數(shù)據(jù)的準(zhǔn)確性完整性。三是安全性,API的不規(guī)范使用可能會導(dǎo)致數(shù)據(jù)在調(diào)用過程中發(fā)生錯誤,致使返回給用戶的數(shù)據(jù)不準(zhǔn)確甚至給操作系統(tǒng)帶來安全風(fēng)險。API按用戶不同權(quán)限提供數(shù)據(jù)服務(wù)其中包括:一是支持內(nèi)容創(chuàng)建,API 允許用戶定制、獲取、上傳數(shù)據(jù);二是禁止內(nèi)容創(chuàng)建,API 只允許用戶定制、獲取數(shù)據(jù),不允許對數(shù)據(jù)進(jìn)行編輯更改。大部分開放給普通用戶的API都禁止用戶對其創(chuàng)建內(nèi)容,主要原因是防止權(quán)威數(shù)據(jù)的漏傳、誤傳甚至丟失,例如用戶獲取實時股票/期貨交易數(shù)據(jù)。
API 調(diào)用是通過 API 有條件的精確獲取用戶所需要的數(shù)據(jù),調(diào)用方式靈活方捷、反映速度快。
二、API調(diào)用股票/期貨數(shù)據(jù)的方法與實現(xiàn)
API調(diào)用數(shù)據(jù)原理如圖1所示。
(一)API接口的選擇
獲取股票/期貨數(shù)據(jù)的API接口主要有:數(shù)據(jù)超市、雅虎、新浪、Google等。
由于計算機(jī)技術(shù)的發(fā)展以及數(shù)據(jù)獲取手段的普及,現(xiàn)在出現(xiàn)了許多數(shù)據(jù)超市,可以更加高效快捷的獲取股票/期貨數(shù)據(jù),不僅節(jié)約了獲取者的時間,同時也有利于獲取更多準(zhǔn)確及時的數(shù)據(jù)。下面介紹三種數(shù)據(jù)接口從中選擇一個作為接下來實驗的數(shù)據(jù)接口。
1. 雅虎
缺點:部分美國假期數(shù)據(jù)缺失;調(diào)用數(shù)據(jù)的次數(shù)有限制,超過規(guī)定次數(shù)就會被警告并封鎖IP地址。優(yōu)點:數(shù)據(jù)比較權(quán)威,準(zhǔn)確性有保障,可以獲取其他國家市場數(shù)據(jù);返回數(shù)據(jù)解析方便,較好提取。
2. 新浪
缺點:股票/期貨歷史數(shù)據(jù)不夠完整。優(yōu)點:速度非常快;返回數(shù)據(jù)容易處理;可以按照使用者要求獲取單一方面的數(shù)據(jù)。
3. Google
缺點:數(shù)據(jù)都是從新浪獲取,獲取自由度低。優(yōu)點:數(shù)據(jù)準(zhǔn)確可靠。
綜合以上接口的優(yōu)缺點,通過對比分析選擇數(shù)據(jù)更加全面完整,獲取范圍更加廣泛的雅虎接口作為實驗中的API接口。
(二)API調(diào)用股票/期貨數(shù)據(jù)
從新浪財經(jīng)網(wǎng)絡(luò)接口直接調(diào)用股票/期貨數(shù)據(jù)。
基本步驟:import requests
r=requests.get("http://hq.sinajs.cn/list=股票/期貨代碼")
print(r.text)
注意:上證股票在輸入股票代碼時要在前面加上sh,深圳股票在股票代碼前面加上sz,港股在股票代碼前面加上hk
下面分別調(diào)取了滬股浦發(fā)銀行sh00000、深股平安銀行sz000001、以及港股頤海國際hk01579、海底撈hk06862的股票交易數(shù)據(jù)和玉米、白銀、黃金的期貨交易數(shù)據(jù)。
浦發(fā)銀行股票交易數(shù)據(jù):
import requests
r=requests. get("http://hq. sinajs. cn/list-s600000")
print (r. text)
var hq_ str_sh600000="浦發(fā)銀行,12. 170, 12. 230, 12. 040, 12. 220, 12. 010, 12.030, 12. 040, 38092059, 460234691. 000, 62300, 12.030,239567, 12. 020, 729627, 12.010, 1215100, 12. 000, 2099000,11. 990, 82800, 12. 040, 192900, 12. 050, 390800 12. 060, 238700, 12. 070, 296100, 12. 080, 2019-11-20, 15:00:00, 00,"
平安銀行股票交易數(shù)據(jù):
import requests
r=requests. get("http://hq. sina js. cn/list=sz000001")
print (r. text)
var hq_str_sz000001="平安銀行16.300, 16.410, 15.850, 16.300, 15.770, 15.850, 15.860, 172438353, 2747598383. 400, 303297, 15. 850, 133200, 15. 840, 64083, 15. 830, 36600, 15. 820, 84700, 15. 810, 36200, 15. 860, 256000 15. 870, 1405307, 15. 880, 51100, 15. 890, 166385, 15. 900, 2019-11-20,15:00:03, 00"
頤海國際股票交易數(shù)據(jù):
import requests
r=requests. get("http://hq. sina js. cn/list=hk01579")
print (r. text)
var hq_str_hk01579="NULL,頤海國際,50.400, 50.400, 51.750,49.500, 5l.350,0.950, 1.885, 51.300, 51.350, 89306132, 1760506, 84.180, 0.000,56.050, 18.020,2019/11/20, 16:08"
海底撈股票交易數(shù)據(jù):
import requests
r=requests. get ("http://hq. sina js. cn/list =hk06862")
print (r. text)
var hq_str_hk06862="NULL, 海底撈35.000, 35.000, 35.400, 34.850, 35.300, 0.300, 0.857, 35.200, 35.300, 89417573, 2541754, 93.634, 0.000, 39.000, 16. 420, 2019/11/20, 16:08"
玉米期貨交易數(shù)據(jù):
import requests
r=requests. get ("http://hq. sina js. cn/list=C0")
print(r. text)
var hq_str_C0="玉米連續(xù),150040, 1857. 00,1857. 00,1844. 00, 1854. 00, 1845. 00. 1846 00, 1846. 00, 1848. 00, 1857. 00, 2316, 165, 1189024,473098,連,玉米,2019-11-20, 0, 1865. 000, 1833.000, 1868.000, 1833.000, 1895. 000, 1823. 000, 1901.000, 1810 000, 16.838"
白銀期貨交易數(shù)據(jù):
import requests
r=requests. get("http://hq. sina js. cn/list=AG0")
print (r. text)
var hq_str_ AG0="白銀連續(xù), 145955, 4170. 00, 4192. 00, 4132. 00, 4185. 00, 4169. 00, 4170. 00, 4170. 00, 4165. 00, 4147. 00, 127, 7, 624046, 1391504, 滬,白銀, 2019-11-20, 0, 4192. 000, 4091. 000, 4280. 000, 4036. 000, 4487. 000, 4036. 000, 4843. 000, 4036. 000, 78. 485 "
黃金期貨交易數(shù)據(jù):
mport requests
r=requests. get("http://hq. sina js. cn/list =AU0")
print(r. text)
var hq_ str_AU0="黃金連續(xù),145954, 337.85,339. 55, 336. 70, 388.30, 339.15, 339. 40, 339.15, 0.00, 337. 75, 25, 6, 169804, 78028,滬,黃金, 2019-11-20,0, 339.550,334.600, 339.550, 327. 600, 347.750, 327. 600, 363. 850, 327. 600, 3.429"
三、API調(diào)用與網(wǎng)絡(luò)爬蟲對比分析
(一)關(guān)于API調(diào)用數(shù)據(jù)方法的分析
API調(diào)用數(shù)據(jù)方法的普及主要原因有:
API 提出了一種代碼的編制復(fù)用機(jī)制,用戶可以直接使用已有的API接口,復(fù)用他人編制出來的代碼完成數(shù)據(jù)的調(diào)用。
API開發(fā)出一種信息隱藏的機(jī)制,用戶在不知道具體細(xì)節(jié)的情況下,就可以完成相應(yīng)的數(shù)據(jù)調(diào)用功能。
API 提供了訪問某些數(shù)據(jù)資源的接口,用戶通過這些API接口就能直接訪問到想要的資源,不用進(jìn)行接口的尋找,節(jié)省數(shù)據(jù)調(diào)用時間。
API調(diào)用數(shù)據(jù)支持多項目、多模塊的數(shù)據(jù)調(diào)用,同時支持私有項目、公開項目、加密項目的數(shù)據(jù)調(diào)用。
API調(diào)用數(shù)據(jù)支持協(xié)同管理,支持添加項目成員,并且可精確控制每個成員的權(quán)限。
API接口支持普通接口、restfull、josn、xml等各種接口的數(shù)據(jù)的調(diào)用,接口返回數(shù)據(jù)也支持word、pdf格式下載,可單個下載也可按模塊下載。
通過調(diào)用 API 接口可以實現(xiàn)股票/期貨數(shù)據(jù)便捷高效的獲取與解析。但所有的數(shù)據(jù)提供商都不會無條件無限制的提供給普通用戶完整數(shù)據(jù),例如在股票/期貨數(shù)據(jù)獲取過程中,有許多擁有重要查詢功能的 API 是不提供給普通用戶的,同時對于開放的 API,一次調(diào)用的返回結(jié)果數(shù)量有限制。同時因為 API 接口自身的復(fù)雜性以及數(shù)據(jù)本身的缺失和疏漏等原因,使用者經(jīng)常會對API進(jìn)行錯誤的使用,導(dǎo)致調(diào)用數(shù)據(jù)和現(xiàn)實不符合甚至出現(xiàn)重大誤差。因此使用 API 調(diào)用數(shù)據(jù)的方法只能解決數(shù)據(jù)獲取中的一部分問題。
(二)API調(diào)用數(shù)據(jù)與網(wǎng)絡(luò)爬蟲對比分析
爬蟲指的是:向網(wǎng)站發(fā)起請求,獲取資源后分析并提取有用數(shù)據(jù)的程序。
網(wǎng)絡(luò)爬蟲的基本原理:發(fā)起請求,使用http庫向需要的數(shù)據(jù)所在的網(wǎng)站發(fā)起請求,即發(fā)送一個Request;獲取響應(yīng)內(nèi)容,如果服務(wù)器能正常響應(yīng),則會得到一個返回數(shù)據(jù);解析返回數(shù)據(jù),通過第三方解析返回的數(shù)據(jù),從中獲取所需要的部分;保存數(shù)據(jù)。將提取的有用的數(shù)據(jù)保存到本地。
與基于API 的數(shù)據(jù)調(diào)用相比,基于網(wǎng)絡(luò)爬蟲的數(shù)據(jù)調(diào)用效率與性能有明顯差距,同時網(wǎng)絡(luò)爬蟲調(diào)用數(shù)據(jù)還要解決網(wǎng)頁的模擬登錄問題,調(diào)用過程復(fù)雜。但是通過網(wǎng)絡(luò)爬蟲進(jìn)行數(shù)據(jù)調(diào)用,能夠解決用戶反復(fù)調(diào)用API接口帶來的數(shù)據(jù)量限制等問題,使能夠調(diào)用的數(shù)據(jù)量明顯增加,調(diào)用過程穩(wěn)定。
但是在只需要部分特定的數(shù)據(jù)時,基于網(wǎng)絡(luò)爬蟲的數(shù)據(jù)調(diào)用方法速度較慢,在處理數(shù)量相同的信息時需要解決更多的問題,在數(shù)據(jù)的返回解析方面也更加復(fù)雜。而通過API調(diào)用數(shù)據(jù)可以一次性完成數(shù)據(jù)調(diào)用、返回、解析、存儲,不需要像網(wǎng)絡(luò)爬蟲獲取數(shù)據(jù)一樣,一個一個頁面解析提取的數(shù)據(jù),同時API調(diào)用返回數(shù)據(jù)大小較小,速度快使調(diào)用更有效率。
四、對數(shù)據(jù)調(diào)用方法的思考
API 調(diào)用數(shù)據(jù)的抓取方式效率高,但因為服務(wù)器限制,不能獲得完整數(shù)據(jù)集,而基于網(wǎng)絡(luò)爬蟲的數(shù)據(jù)獲取方案可以獲得較大的數(shù)據(jù),但無法一次性抓取用戶想要的數(shù)據(jù),獲取效率比較低。所以需要將兩者結(jié)合起來,以實現(xiàn)最佳數(shù)據(jù)抓取獲取效果。
首先,計算需要抓取的數(shù)據(jù)大小,如果需要獲取的數(shù)據(jù)量小于用戶使用的API接口規(guī)定訪問的最大限制次數(shù),則自動調(diào)用API接口獲取數(shù)據(jù)。反之就使用網(wǎng)絡(luò)爬蟲獲取用戶所需要的數(shù)據(jù)。如果在使用API接口的過程中,累計數(shù)據(jù)量超過了接口所允許的最大訪問次數(shù),這時也可以自動轉(zhuǎn)換為網(wǎng)絡(luò)爬蟲獲取剩下部分的數(shù)據(jù)。獲取完整數(shù)據(jù)后將數(shù)據(jù)放入一個數(shù)據(jù)庫中,數(shù)據(jù)庫自動檢測對比數(shù)據(jù)的真實準(zhǔn)確性,從而輸出用戶所需要的數(shù)據(jù)。
五、結(jié)語
本文主要介紹一種基于API接口獲取股票/期貨數(shù)據(jù)的方法,將其與傳統(tǒng)網(wǎng)絡(luò)爬蟲獲取數(shù)據(jù)方法進(jìn)行對比。提出兩者相結(jié)合的方法,一方面彌補(bǔ)了API調(diào)用數(shù)據(jù)的調(diào)用次數(shù)限制問題,另一方面解決了網(wǎng)絡(luò)爬蟲調(diào)用數(shù)據(jù)需要模擬登陸和大量的頁面解析的問題。結(jié)合兩者優(yōu)點提高調(diào)用效率保證數(shù)據(jù)的準(zhǔn)確性與完整性,但是從大數(shù)據(jù)的發(fā)展角度出發(fā),在不考慮API訪問次數(shù)限制的情況下,基于API的數(shù)據(jù)獲取方法在獲取效率方面還有很大的發(fā)展空間,之后的研究可以從如何降低API接口的限制訪問次數(shù)入手提出更加符合要求方便快捷的數(shù)據(jù)獲取方法。
參考文獻(xiàn):
[1]廉捷,周欣,曹偉,劉云.新浪微博數(shù)據(jù)挖掘方案[J].清華大學(xué)學(xué)報(自然科學(xué)版),2011,51(10):1300-1305.
[2]冰雨夢.軟件接口的歷史和未來[J]. 中文信息:程序春秋,2002(06):18-19.
[3]李正,吳敬征,李明樹.API使用的關(guān)鍵問題研究[J].軟件學(xué)報,2018,29(06):1716-1738.
[4]趙前東,葉猛.微博熱點話題檢測系統(tǒng)的設(shè)計與實現(xiàn)[J].電視技術(shù),2013(03):211-214.
[5]王佳秋.基于用戶行為及關(guān)系的微博電商企業(yè)影響力度量[D].哈爾濱:哈爾濱商業(yè)大學(xué),2013.
[6]徐雁飛,劉淵,吳文鵬.社交網(wǎng)絡(luò)數(shù)據(jù)采集技術(shù)研究與應(yīng)用[J].計算機(jī)科學(xué),2017(01):277-282.
[7]石磊.新浪API與網(wǎng)絡(luò)爬蟲結(jié)合獲取數(shù)據(jù)的研究與應(yīng)用[J].中國電子商務(wù),2013(22):58-59.
[8]李良.基于Python的測井?dāng)?shù)據(jù)校驗對比[J].信息系統(tǒng)工程,2014(06):142.
[9]余斌.基于Bottle的Python網(wǎng)絡(luò)應(yīng)用開發(fā)[J].無線互聯(lián)科技,2014(06):29+103.
[10]劉海房,莫世鴻,龔振,范冰冰.面向API調(diào)用的開放數(shù)據(jù)存儲管理研究[J].計算機(jī)應(yīng)用與軟件,2018,35(08):93-97.
(作者單位:昆明理工大學(xué)公共安全與應(yīng)急管理學(xué)院)