股票數據的獲取目前有如下兩種方法可以獲取:
1.http/javascript接口取數據
2.web-service接口
1.http/javascript接口取數據
1.1Sina股票數據接口
以大秦鐵路(股票代碼:601006)為例,如果要獲取它的最新行情,只需訪問新浪的股票數據
接口:http://hq.sinajs.cn/list=sh601006這個url會返回一串文本,例如:
var hq_str_sh601006="大秦鐵路, 27.55, 27.25, 26.91, 27.55, 26.20, 26.91, 26.92,
22114263, 589824680, 4695, 26.91, 57590, 26.90, 14700, 26.89, 14300,
26.88, 15100, 26.87, 3100, 26.92, 8900, 26.93, 14230, 26.94, 25150, 26.95, 15220, 26.96, 2008-01-11, 15:05:32";
這個字符串由許多數據拼接在一起,不同含義的數據用逗號隔開了,按照程序員的思路,順序號從0開始。
0:”大秦鐵路”,股票名字;
1:”27.55″,今日開盤價;
2:”27.25″,昨日收盤價;
3:”26.91″,當前價格;
4:”27.55″,今日最高價;
5:”26.20″,今日最低價;
6:”26.91″,競買價,即“買一”報價;
7:”26.92″,競賣價,即“賣一”報價;
8:”22114263″,成交的股票數,由于股票交易以一百股為基本單位,所以在使用時,通常把該值除以一百;
9:”589824680″,成交金額,單位為“元”,為了一目了然,通常以“萬元”為成交金額的單位,所以通常把該值除以一萬;
10:”4695″,“買一”申請4695股,即47手;
11:”26.91″,“買一”報價;
12:”57590″,“買二”
13:”26.90″,“買二”
14:”14700″,“買三”
15:”26.89″,“買三”
16:”14300″,“買四”
17:”26.88″,“買四”
18:”15100″,“買五”
19:”26.87″,“買五”
20:”3100″,“賣一”申報3100股,即31手;
21:”26.92″,“賣一”報價
(22, 23), (24, 25), (26,27), (28, 29)分別為“賣二”至“賣四的情況”
30:”2008-01-11″,日期;
31:”15:05:32″,時間;
這個接口對于JavaScript程序非常方便,通常的使用方式為,靜態或動態地在頁面中插入:
<script type="text/javascript" src="http://hq.sinajs.cn/list=sh601006" charset="gb2312">
</script>
<script type="text/javascript">
var elements=hq_str_sh601006.split(",");
document.write("current price:"+elements[3]);
</script>
這段代碼輸出大秦鐵路(股票代碼:601006)的當前股價
current price:14.20
如果你要同時查詢多個股票,那么在URL最后加上一個逗號,再加上股票代碼就可以了;比如你要一次查詢大秦鐵路(601006)和大同煤業(601001)的行情,就這樣使用URL:
http://hq.sinajs.cn/list=sh601003,sh601001
但如果你要查詢大盤指數,情況會有不同,比如查詢上證綜合指數(000001),使用如下URL:
http://hq.sinajs.cn/list=s_sh000001 服務器返回的數據為:
var hq_str_s_sh000001="上證指數,3094.668,-128.073,-3.97,436653,5458126";
數據含義分別為:指數名稱,當前點數,當前價格,漲跌率,成交量(手),成交額(萬元);
查詢深圳成指的URL為:
http://hq.sinajs.cn/list=s_sz399001
對于股票的K線圖,日線圖等的獲取可以通過請求http://image.sinajs.cn/…./…/*.gif此URL獲取,其中*代表股票代碼,詳見如下:
查看日K線圖:
http://image.sinajs.cn/newchart/daily/n/sh601006.gif
分時線的查詢:
http://image.sinajs.cn/newchart/min/n/sh000001.gif
日K線查詢:
http://image.sinajs.cn/newchart/daily/n/sh000001.gif
周K線查詢:
http://image.sinajs.cn/newchart/weekly/n/sh000001.gif
月K線查詢:
http://image.sinajs.cn/newchart/monthly/n/sh000001.gif
2.?? web-service接口
2.1? CHINAstock的web-service:
http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx
中國股票行情數據 WEB 服務(支持深圳和上海股市的全部基金、債券和股票),數據即時更新。輸出GIF分時走勢圖、日/周/月 K 線圖、及時行情數據(股票名稱、行情時間、最新價、昨收盤、今開盤、漲跌額、最低、最高、漲跌幅、成交量、成交額、競買價、競賣價、委比、買一 - 買五、賣一 - 賣五)。此WEB服務提供了如下幾個接口:
2.1.1? getStockImageByCode
GET 股票GIF分時走勢圖
INput:theStockCode = 股票代號,如:sh000001
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: http://WebXml.com.cn/getStockImageByCode
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
? <soap:Body>
??? <getStockImageByCode xmlns="http://WebXml.com.cn/">
????? <theStockCode>string</theStockCode>
??? </getStockImageByCode>
? </soap:Body>
</soap:Envelope>
Output:
2.1.2 getStockImageByteByCode
獲得中國股票GIF分時走勢圖字節數組
INput:theStockCode = 股票代號,如:sh000001
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host: www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://WebXml.com.cn/getStockImageByteByCode" <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">? <soap:Body>??? <getStockImageByteByCode xmlns="http://WebXml.com.cn/">????? <theStockCode>string</theStockCode>??? </getStockImageByteByCode>? </soap:Body></soap:Envelope>
返回的數據如下:
<?xml version="1.0" encoding="utf-8" ?>
? <base64Binary xmlns="http://WebXml.com.cn/">R0lGODlhIQIsAfcAAAAAAAwLBxkGBQ4ODhAQEBsSChUVFS4TDB8eGQkA9koPCDAAzy4mFVgAp2UYC0IqEUYuBVwiDEAsI1QnFX8AgDU1NUozFlgxD6cBWVY5FnIwEmQ4Gc0AMlhDHPEADlVJMEpKSm1IHOUBWpY3FZMyVY9IGXRWIEFmWGNYUmpdPXJgHQB8HK9EGGBgX4lXIACoAHhkMyt4m4VkJtstbv8A
2.1.3? getStockImage_kByCode
直接獲得中國股票GIF日/周/月 K 線圖(545*300pixel/72dpi)
INPUT: theStockCode = 股票代號
????? theType = K 線圖類型(D:日[默認]、W:周、M:月),
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host: www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://WebXml.com.cn/getStockImage_kByCode" <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">? <soap:Body>??? <getStockImage_kByCode xmlns="http://WebXml.com.cn/">????? <theStockCode>string</theStockCode>????? <theType>string</theType>??? </getStockImage_kByCode>? </soap:Body></soap:Envelope>
比如按照下圖所示輸入:
返回的結果就是周K線圖:
2.1.4? getStockImage_kByteByCode
獲得中國股票GIF日/周/月 K 線圖字節數組
Input:theStockCode = 股票代號,如:sh000001
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host: www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://WebXml.com.cn/getStockImage_kByteByCode" <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">? <soap:Body>??? <getStockImage_kByteByCode xmlns="http://WebXml.com.cn/">????? <theStockCode>string</theStockCode>????? <theType>string</theType>??? </getStockImage_kByteByCode>? </soap:Body></soap:Envelope>HTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: length <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">? <soap:Body>??? <getStockImage_kByteByCodeResponse xmlns="http://WebXml.com.cn/">????? <getStockImage_kByteByCodeResult>base64Binary</getStockImage_kByteByCodeResult>??? </getStockImage_kByteByCodeResponse>? </soap:Body></soap:Envelope>比如按照下圖輸入
返回的結果就是周K線圖字節數組
<?xml version="1.0" encoding="utf-8" ?>
? <base64Binary xmlns="http://WebXml.com.cn/">R0lGODlhIQIsAfcAAAAAAAwLBxkGBQ4ODhAQEBsSChUVFS4TDB8eGQkA9koPCDAAzy4mFVgAp2UYC0IqEUYuBVwiDEAsI1QnFX8AgDU1NUozFlgxD6cBWVY5FnIwEmQ4Gc0AMlhDHPEADlVJMEpKSm1IHOUBWpY3FZMyVY9IGXRWIEFmWGNYUmpdPXJgHQB8HK9EGGBgX4lXIACoAHhkMyt4m4VkJtstbv8A
2.1.5? getStockInfoByCode
獲得中國股票及時行情
input:theStockCode = 股票代號
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host: www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://WebXml.com.cn/getStockInfoByCode" <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">? <soap:Body>??? <getStockInfoByCode xmlns="http://WebXml.com.cn/">????? <theStockCode>string</theStockCode>??? </getStockInfoByCode>? </soap:Body></soap:Envelope>返回的值一個一維字符串數組 String(24),結構為:String(0)股票代號、String(1)股票名稱、String(2)行情時間、String(3)最新價(元)、String(4)昨收盤(元)、String(5)今開盤(元)、String(6)漲跌額(元)、String(7)最低(元)、 String(8)最高(元)、String(9)漲跌幅(%)、String(10)成交量(手)、String(11)成交額(萬元)、String (12)競買價(元)、String(13)競賣價(元)、String(14)委比(%)、String(15)-String(19)買一 - 買五(元)/手、String(20)-String(24)賣一 - 賣五(元)/手。
Web service的方法類似于現在concurrent項目的DBWS數據的獲取,都是通過SOAP協議向DBWS服務器獲取相關的數據。
利用雅虎查中國股票
http://quote.yahoo.com/d/quotes.csv?s=MSFT&f=slc1wop
返回微軟的股票價格
"MSFT","4:00pm - <b>30.70</b>",+1.04,"21.46 - 30.75",29.77,29.66
http://quote.yahoo.com/d/quotes.csv?s=000969.SZ&f=slc1wop
這個返回安泰科技的,一般有半個小時的延遲。
但是s=000969.sz 這個后面的sz是什么意思呢?
深圳:)
滬市是SS后綴
ChinaStockWebService
http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx
WebXml.com.cn 中國股票行情數據 WEB 服務(支持深圳和上海股市的全部基金、債券和股票), 數據即時更新。輸出GIF分時走勢圖、日/周/月 K 線圖、及時行情數據(股票名稱、行情時間、最新價、昨收盤、今開盤、漲跌額、最低、最高、漲跌幅、成交量、成交額、競買價、競賣價、委比、買一 - 買五、賣一 - 賣五)。此中國股票行情數據 WEB 服務僅作為用戶獲取信息之目的,并不構成投資建議。WebXml.com.cn 和/或其各供應商不為本頁面提供信息的錯誤、殘缺、延遲或因依靠此信息所采取的任何行動負責。市場有風險,投資需謹慎。
此中國股票行情數據Web Services請不要用于任何商業目的,若有需要請聯系我們,歡迎技術交流。 QQ:8409035
使用本站 WEB 服務請注明或鏈接本站:http://www.webxml.com.cn/ 感謝大家的支持!
股票輸入注意事項:因上海股票和深圳股票在代號上有重疊,所以在輸入上海股票請在代號前加 SH,深圳加 SZ(不區分大小寫),例:上證指數 sh000001,深發展A sz000001。如不輸入股票代號默認上證指數 sh000001
支持下列操作。有關正式定義,請查看服務說明。
?getStockImageByCode
直接獲得中國股票GIF分時走勢圖(545*300pixel/72dpi)
輸入參數:theStockCode = 股票代號,如:sh000001; 返回數據:股票GIF分時走勢圖。
?getStockImageByteByCode
獲得中國股票GIF分時走勢圖字節數組
輸入參數:theStockCode = 股票代號,如:sh000001; 返回數據:股票GIF分時走勢圖字節數組。
字節流到圖片可以參考以下方法(.NET vb):
HttpContext.Current.Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache) '不緩存
HttpContext.Current.Response.ClearContent()
HttpContext.Current.Response.ContentType = "image/Gif"
HttpContext.Current.Response.BinaryWrite(Ary) 'Ary 圖片字節數組
HttpContext.Current.Response.End()
?getStockImage_kByCode
直接獲得中國股票GIF日/周/月 K 線圖(545*300pixel/72dpi)
輸入參數:theStockCode = 股票代號,如:sh000001;theType = K 線圖類型(D:日[默認]、W:周、M:月),返回數據:股票GIF日 K 線圖。
?getStockImage_kByteByCode
獲得中國股票GIF日/周/月 K 線圖字節數組
輸入參數:theStockCode = 股票代號,如:sh000001;theType = K 線圖類型(D:日[默認]、W:周、M:月),返回數據:股票GIF日 K 線圖字節數組。
?getStockInfoByCode
獲得中國股票及時行情 String()
輸 入參數:theStockCode = 股票代號,如:sh000001; 返回數據:一個一維字符串數組 String(24),結構為:String(0)股票代號、String(1)股票名稱、String(2)行情時間、String(3)最新價(元)、String(4)昨收盤(元)、String(5)今開盤(元)、String(6)漲跌額(元)、String(7)最低(元)、 String(8)最高(元)、String(9)漲跌幅(%)、String(10)成交量(手)、String(11)成交額(萬元)、 String(12)競買價(元)、String(13)競賣價(元)、String(14)委比(%)、String(15)-String(19)買一 - 買五(元)/手、String(20)-String(24)賣一 - 賣五(元)/手。
股票行情的變化, 是以秒為單位的, 一到開盤, 每秒鐘都要更新每支股票的變化
一共有1500支左右的A股, 包括上證A股和深證A股
試了新浪的接口, 只能一次最多查150支股票左右
用PHP寫好了程序, 單進程采集, 更新完這1500支, 平均需要
20.5953 seconds. 0.37MB memory usage還不算數據庫更新, 還沒有試多進程, 反正也不太具備實用價值, 這方法本身就有問題
而且每秒要向新浪發起10次查詢, 不知道丫的會不會封我IP...
和webxml的技術聯系了, 丫的還不如新浪, 一次只能查詢40支, 而且要錢, 不限查詢給我打完折一年要我1萬人民幣.
最終, 還是讓我找到了解決辦法, 方法....我保密, 商業價值還是比較高的. 實現了最小輸據量傳輸的實時行情同步.
沒有優化的情況下, 一秒同步采集一次時, 需要占用1.5M帶寬, 一次同步需要0.3-0.4秒左右的時間.
優化完后, 一秒同步采集一次, 峰值是1.5M, 不過占用時間很短.
明天繼續搞數據庫部份, 看來要在空閑時間再入庫了. 從而形成歷史數據庫.
有一個思路, 就是用現有的股票軟件, 破解其現有的查詢渠道, 開發一個專門生成行情數據的程序.
搜索了半天, 一個叫大贏家的在搞這個, 數據項比較多, 收費不低, 好像是2,3萬, 看他介紹還不錯的, 東西是不是那么好就不知道了.
關于速度
以新浪為例, 新浪網頁上默認的刷新時間是5秒, 如果服務器上要跟它數據保持同步, 需要注意服務器端跟新浪的連接速度要快
查詢次數如果過多, 不知道會不會封IP. 不過普通訪客都有5秒間隔查詢的權限, 如果要一秒一次, 那加4個速度同樣的代理就可以解決了:)
另外注意文件鎖的問題
數據量 = 1500支 * (4*60/3) = 12萬
(按每股3秒變動一次算一天開盤4小時)
每開盤一天, 估計數據庫要增加12萬條記錄, 數據庫, 表, 字段要規劃好, 準備使用MYSQL或SQLITE
今天沒開盤, 等明天開了盤, 搞了數據庫再說吧
我之所以開始這個題目,是因為我又看到有人問起如何從WEB中取數據了。隨著炒股的人越來越多,可能很多人喜歡用EXCEL來分析股票信息。可是,如何得到股價信息呢?這又是一個問題。
我之前看到的程序,都是從類似business.sohu.com或finance.sina.com.cn中取數據。用XMLHTTP讀取大段的網頁然后進行數據分離。這種做是對的,但是卻不是最快的。要知道用XMLHTTP讀取數據的過程,其實就是你打開網頁的過程。你打開網頁有多快,XMLHTTP就有多快。因此,如何獲取最低層的那個GET是最重要的。經過一段時間的努力,我找到了金融街網站的股票數據信息的最底層的那個GET,速度快,底層的返回數據沒有一句http語言,純文本,易于處理。
現在就將這兩個函數公開,希望能對用到的朋友提供一點幫助。
對于其他網頁數據的獲取,請參照下面的GetHttp函數。只需要在函數參數中加入自己的網址就行了。另外,如果你是經常需要從不同的網頁獲取數據,為了便于處理得到的文本,建議學習一下“正則表達式”,我們論壇上用的。
好了,言歸正傳。下面就介紹這兩個函數。
取金融街某支股票當天數據的函數Jrj0DayData
? 函數使用說明
?參數StockCode輸入股票代碼
?函數以數組形式返回當天數據
Function Jrj0DayData(ByRef StockCode As String)
??
??? Dim Url As String
??
??? Url = " http://quote.jrj.com.cn/htmdata/html/" & StockCode & ".htm"
??? Url = GetHttp(Url)
??? Jrj0DayData = Split(Url, ",")
??
End Function
返回的數組有元素38個,數組元素含義如下:
數組的各元素的含義如下所示:
??? Debug.Print "日期" & arrA(1)
??? Debug.Print "時間" & arrA(2)
??? Debug.Print "成交價" & arrA(3)
??? Debug.Print "現手" & arrA(4)
??? Debug.Print "漲跌" & arrA(5)
??? Debug.Print "幅度" & arrA(6)
??? Debug.Print "均價" & arrA(7)
??? Debug.Print "總量" & arrA(8)
??? Debug.Print "金額" & arrA(9)
??? Debug.Print "主買或外盤" & arrA(10)
??? Debug.Print "主賣或內盤" & arrA(11)
??? Debug.Print "昨收" & arrA(12)
??? Debug.Print "開盤" & arrA(13)
??? Debug.Print "最高" & arrA(14)
??? Debug.Print "最低" & arrA(15)
??? Debug.Print "委比" & arrA(16)
??? Debug.Print "委差" & arrA(17)
??? Debug.Print "量比" & arrA(18)
??? '下面的格式就是買賣交替,從19-38
??? Debug.Print "買①" & arrA(19)
??? Debug.Print "買①量" & arrA(20)
??? Debug.Print "賣①" & arrA(21)
??? Debug.Print "賣①量" & arrA(22)
可以說,這一個數組已經包括了某支股票當日的基本信息,比較全了。
第二個函數,獲取歷史價格信息
金融街取某一股票80天數據的函數
用法:參數StockCode輸入某股票代碼。函數以數組形式返回80天數據,數組每個元素中存貯著類似(2007-04-20? 開:48.23? 高:50.79? 低:48.00? 收:50.27? 量:461974? 額:228812.67 )的數據。
Function Jrj80DayData(ByRef StockCode As String)
??
??? Dim Url As String
??? Dim objREGEXP As Object
??
??? Url = " http://chart.jrj.com/htmdata/KLINE/ " & StockCode & ".js"
??? Url = GetHttp(Url)
??
??? Set objREGEXP = CreateObject("VBSCRIPT.REGEXP")
??? With objREGEXP
?
??????? .Global = True
??????? .Pattern = "[a\[][^\]]*[\]]"
??????? Url = .Replace(Url, "")
??????
??? End With
??? Set objREGEXP = Nothing
??
??? Url = Replace(Url, "= ", "")
??? Url = Replace(Url, """", "")
??? Url = Replace(Url, Chr(13), "")
??? Url = Replace(Url, ";", "")
??
??? Jrj80DayData = Split(Url, Chr(10))
??
End Function
函數返回的數組有80個元素,從0-79中依次存著類似2007-04-20? 開:48.23? 高:50.79? 低:48.00? 收:50.27? 量:461974? 額:228812.67 這樣的內容。至于你要事先顯示此字符串還是要只取數據進行分析,那就隨你自己了。
前面兩個函數的運用,是要用到下面的這兩個函數的。這兩個函數是必須的。一個是xmlhttp組件的運用,一個是糾正亂碼的。
Function GetHttp(Url)
??? Dim objXML
??? On Error Resume Next
??? Set objXML = CreateObject("Microsoft.XMLHTTP")
??? With objXML
??????? .Open "Get", Url, False, "", ""
??????? .Send
??????? GetHttp = .ResponseBody
??? End With
??? GetHttp = BytesToBstr(GetHttp, "GB2312")
??? Set objXML = Nothing
??? On Error GoTo 0
End Function
Function BytesToBstr(strBody, CodeBase)
??? Dim objStream
??? Set objStream = CreateObject("Adodb.Stream")
??
??? With objStream
??????? .Type = 1
??????? .Mode = 3
??????? .Open
??????? .Write strBody
??????? .Position = 0
??????? .Type = 2
??????? .Charset = CodeBase
??????? BytesToBstr = .ReadText
??? End With
??? objStream.Close
??? Set objStream = Nothing
End Function
1.http/javascript接口取數據
2.web-service接口
1.http/javascript接口取數據
1.1Sina股票數據接口
以大秦鐵路(股票代碼:601006)為例,如果要獲取它的最新行情,只需訪問新浪的股票數據
接口:http://hq.sinajs.cn/list=sh601006這個url會返回一串文本,例如:
var hq_str_sh601006="大秦鐵路, 27.55, 27.25, 26.91, 27.55, 26.20, 26.91, 26.92,
22114263, 589824680, 4695, 26.91, 57590, 26.90, 14700, 26.89, 14300,
26.88, 15100, 26.87, 3100, 26.92, 8900, 26.93, 14230, 26.94, 25150, 26.95, 15220, 26.96, 2008-01-11, 15:05:32";
這個字符串由許多數據拼接在一起,不同含義的數據用逗號隔開了,按照程序員的思路,順序號從0開始。
0:”大秦鐵路”,股票名字;
1:”27.55″,今日開盤價;
2:”27.25″,昨日收盤價;
3:”26.91″,當前價格;
4:”27.55″,今日最高價;
5:”26.20″,今日最低價;
6:”26.91″,競買價,即“買一”報價;
7:”26.92″,競賣價,即“賣一”報價;
8:”22114263″,成交的股票數,由于股票交易以一百股為基本單位,所以在使用時,通常把該值除以一百;
9:”589824680″,成交金額,單位為“元”,為了一目了然,通常以“萬元”為成交金額的單位,所以通常把該值除以一萬;
10:”4695″,“買一”申請4695股,即47手;
11:”26.91″,“買一”報價;
12:”57590″,“買二”
13:”26.90″,“買二”
14:”14700″,“買三”
15:”26.89″,“買三”
16:”14300″,“買四”
17:”26.88″,“買四”
18:”15100″,“買五”
19:”26.87″,“買五”
20:”3100″,“賣一”申報3100股,即31手;
21:”26.92″,“賣一”報價
(22, 23), (24, 25), (26,27), (28, 29)分別為“賣二”至“賣四的情況”
30:”2008-01-11″,日期;
31:”15:05:32″,時間;
這個接口對于JavaScript程序非常方便,通常的使用方式為,靜態或動態地在頁面中插入:
<script type="text/javascript" src="http://hq.sinajs.cn/list=sh601006" charset="gb2312">
</script>
<script type="text/javascript">
var elements=hq_str_sh601006.split(",");
document.write("current price:"+elements[3]);
</script>
這段代碼輸出大秦鐵路(股票代碼:601006)的當前股價
current price:14.20
如果你要同時查詢多個股票,那么在URL最后加上一個逗號,再加上股票代碼就可以了;比如你要一次查詢大秦鐵路(601006)和大同煤業(601001)的行情,就這樣使用URL:
http://hq.sinajs.cn/list=sh601003,sh601001
但如果你要查詢大盤指數,情況會有不同,比如查詢上證綜合指數(000001),使用如下URL:
http://hq.sinajs.cn/list=s_sh000001 服務器返回的數據為:
var hq_str_s_sh000001="上證指數,3094.668,-128.073,-3.97,436653,5458126";
數據含義分別為:指數名稱,當前點數,當前價格,漲跌率,成交量(手),成交額(萬元);
查詢深圳成指的URL為:
http://hq.sinajs.cn/list=s_sz399001
對于股票的K線圖,日線圖等的獲取可以通過請求http://image.sinajs.cn/…./…/*.gif此URL獲取,其中*代表股票代碼,詳見如下:
查看日K線圖:
http://image.sinajs.cn/newchart/daily/n/sh601006.gif

分時線的查詢:
http://image.sinajs.cn/newchart/min/n/sh000001.gif

日K線查詢:
http://image.sinajs.cn/newchart/daily/n/sh000001.gif

周K線查詢:
http://image.sinajs.cn/newchart/weekly/n/sh000001.gif

月K線查詢:
http://image.sinajs.cn/newchart/monthly/n/sh000001.gif

2.?? web-service接口
2.1? CHINAstock的web-service:
http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx
中國股票行情數據 WEB 服務(支持深圳和上海股市的全部基金、債券和股票),數據即時更新。輸出GIF分時走勢圖、日/周/月 K 線圖、及時行情數據(股票名稱、行情時間、最新價、昨收盤、今開盤、漲跌額、最低、最高、漲跌幅、成交量、成交額、競買價、競賣價、委比、買一 - 買五、賣一 - 賣五)。此WEB服務提供了如下幾個接口:
2.1.1? getStockImageByCode
GET 股票GIF分時走勢圖
INput:theStockCode = 股票代號,如:sh000001
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: http://WebXml.com.cn/getStockImageByCode
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
? <soap:Body>
??? <getStockImageByCode xmlns="http://WebXml.com.cn/">
????? <theStockCode>string</theStockCode>
??? </getStockImageByCode>
? </soap:Body>
</soap:Envelope>
Output:
2.1.2 getStockImageByteByCode
獲得中國股票GIF分時走勢圖字節數組
INput:theStockCode = 股票代號,如:sh000001
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host: www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://WebXml.com.cn/getStockImageByteByCode" <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">? <soap:Body>??? <getStockImageByteByCode xmlns="http://WebXml.com.cn/">????? <theStockCode>string</theStockCode>??? </getStockImageByteByCode>? </soap:Body></soap:Envelope>
返回的數據如下:
<?xml version="1.0" encoding="utf-8" ?>
? <base64Binary xmlns="http://WebXml.com.cn/">R0lGODlhIQIsAfcAAAAAAAwLBxkGBQ4ODhAQEBsSChUVFS4TDB8eGQkA9koPCDAAzy4mFVgAp2UYC0IqEUYuBVwiDEAsI1QnFX8AgDU1NUozFlgxD6cBWVY5FnIwEmQ4Gc0AMlhDHPEADlVJMEpKSm1IHOUBWpY3FZMyVY9IGXRWIEFmWGNYUmpdPXJgHQB8HK9EGGBgX4lXIACoAHhkMyt4m4VkJtstbv8A
2.1.3? getStockImage_kByCode
直接獲得中國股票GIF日/周/月 K 線圖(545*300pixel/72dpi)
INPUT: theStockCode = 股票代號
????? theType = K 線圖類型(D:日[默認]、W:周、M:月),
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host: www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://WebXml.com.cn/getStockImage_kByCode" <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">? <soap:Body>??? <getStockImage_kByCode xmlns="http://WebXml.com.cn/">????? <theStockCode>string</theStockCode>????? <theType>string</theType>??? </getStockImage_kByCode>? </soap:Body></soap:Envelope>
比如按照下圖所示輸入:
返回的結果就是周K線圖:
2.1.4? getStockImage_kByteByCode
獲得中國股票GIF日/周/月 K 線圖字節數組
Input:theStockCode = 股票代號,如:sh000001
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host: www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://WebXml.com.cn/getStockImage_kByteByCode" <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">? <soap:Body>??? <getStockImage_kByteByCode xmlns="http://WebXml.com.cn/">????? <theStockCode>string</theStockCode>????? <theType>string</theType>??? </getStockImage_kByteByCode>? </soap:Body></soap:Envelope>HTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: length <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">? <soap:Body>??? <getStockImage_kByteByCodeResponse xmlns="http://WebXml.com.cn/">????? <getStockImage_kByteByCodeResult>base64Binary</getStockImage_kByteByCodeResult>??? </getStockImage_kByteByCodeResponse>? </soap:Body></soap:Envelope>比如按照下圖輸入
返回的結果就是周K線圖字節數組
<?xml version="1.0" encoding="utf-8" ?>
? <base64Binary xmlns="http://WebXml.com.cn/">R0lGODlhIQIsAfcAAAAAAAwLBxkGBQ4ODhAQEBsSChUVFS4TDB8eGQkA9koPCDAAzy4mFVgAp2UYC0IqEUYuBVwiDEAsI1QnFX8AgDU1NUozFlgxD6cBWVY5FnIwEmQ4Gc0AMlhDHPEADlVJMEpKSm1IHOUBWpY3FZMyVY9IGXRWIEFmWGNYUmpdPXJgHQB8HK9EGGBgX4lXIACoAHhkMyt4m4VkJtstbv8A
2.1.5? getStockInfoByCode
獲得中國股票及時行情
input:theStockCode = 股票代號
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host: www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://WebXml.com.cn/getStockInfoByCode" <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">? <soap:Body>??? <getStockInfoByCode xmlns="http://WebXml.com.cn/">????? <theStockCode>string</theStockCode>??? </getStockInfoByCode>? </soap:Body></soap:Envelope>返回的值一個一維字符串數組 String(24),結構為:String(0)股票代號、String(1)股票名稱、String(2)行情時間、String(3)最新價(元)、String(4)昨收盤(元)、String(5)今開盤(元)、String(6)漲跌額(元)、String(7)最低(元)、 String(8)最高(元)、String(9)漲跌幅(%)、String(10)成交量(手)、String(11)成交額(萬元)、String (12)競買價(元)、String(13)競賣價(元)、String(14)委比(%)、String(15)-String(19)買一 - 買五(元)/手、String(20)-String(24)賣一 - 賣五(元)/手。
Web service的方法類似于現在concurrent項目的DBWS數據的獲取,都是通過SOAP協議向DBWS服務器獲取相關的數據。
利用雅虎查中國股票
http://quote.yahoo.com/d/quotes.csv?s=MSFT&f=slc1wop
返回微軟的股票價格
"MSFT","4:00pm - <b>30.70</b>",+1.04,"21.46 - 30.75",29.77,29.66
http://quote.yahoo.com/d/quotes.csv?s=000969.SZ&f=slc1wop
這個返回安泰科技的,一般有半個小時的延遲。
但是s=000969.sz 這個后面的sz是什么意思呢?
深圳:)
滬市是SS后綴
ChinaStockWebService
http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx
WebXml.com.cn 中國股票行情數據 WEB 服務(支持深圳和上海股市的全部基金、債券和股票), 數據即時更新。輸出GIF分時走勢圖、日/周/月 K 線圖、及時行情數據(股票名稱、行情時間、最新價、昨收盤、今開盤、漲跌額、最低、最高、漲跌幅、成交量、成交額、競買價、競賣價、委比、買一 - 買五、賣一 - 賣五)。此中國股票行情數據 WEB 服務僅作為用戶獲取信息之目的,并不構成投資建議。WebXml.com.cn 和/或其各供應商不為本頁面提供信息的錯誤、殘缺、延遲或因依靠此信息所采取的任何行動負責。市場有風險,投資需謹慎。
此中國股票行情數據Web Services請不要用于任何商業目的,若有需要請聯系我們,歡迎技術交流。 QQ:8409035
使用本站 WEB 服務請注明或鏈接本站:http://www.webxml.com.cn/ 感謝大家的支持!
股票輸入注意事項:因上海股票和深圳股票在代號上有重疊,所以在輸入上海股票請在代號前加 SH,深圳加 SZ(不區分大小寫),例:上證指數 sh000001,深發展A sz000001。如不輸入股票代號默認上證指數 sh000001
支持下列操作。有關正式定義,請查看服務說明。
?getStockImageByCode
直接獲得中國股票GIF分時走勢圖(545*300pixel/72dpi)
輸入參數:theStockCode = 股票代號,如:sh000001; 返回數據:股票GIF分時走勢圖。
?getStockImageByteByCode
獲得中國股票GIF分時走勢圖字節數組
輸入參數:theStockCode = 股票代號,如:sh000001; 返回數據:股票GIF分時走勢圖字節數組。
字節流到圖片可以參考以下方法(.NET vb):
HttpContext.Current.Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache) '不緩存
HttpContext.Current.Response.ClearContent()
HttpContext.Current.Response.ContentType = "image/Gif"
HttpContext.Current.Response.BinaryWrite(Ary) 'Ary 圖片字節數組
HttpContext.Current.Response.End()
?getStockImage_kByCode
直接獲得中國股票GIF日/周/月 K 線圖(545*300pixel/72dpi)
輸入參數:theStockCode = 股票代號,如:sh000001;theType = K 線圖類型(D:日[默認]、W:周、M:月),返回數據:股票GIF日 K 線圖。
?getStockImage_kByteByCode
獲得中國股票GIF日/周/月 K 線圖字節數組
輸入參數:theStockCode = 股票代號,如:sh000001;theType = K 線圖類型(D:日[默認]、W:周、M:月),返回數據:股票GIF日 K 線圖字節數組。
?getStockInfoByCode
獲得中國股票及時行情 String()
輸 入參數:theStockCode = 股票代號,如:sh000001; 返回數據:一個一維字符串數組 String(24),結構為:String(0)股票代號、String(1)股票名稱、String(2)行情時間、String(3)最新價(元)、String(4)昨收盤(元)、String(5)今開盤(元)、String(6)漲跌額(元)、String(7)最低(元)、 String(8)最高(元)、String(9)漲跌幅(%)、String(10)成交量(手)、String(11)成交額(萬元)、 String(12)競買價(元)、String(13)競賣價(元)、String(14)委比(%)、String(15)-String(19)買一 - 買五(元)/手、String(20)-String(24)賣一 - 賣五(元)/手。
股票行情的變化, 是以秒為單位的, 一到開盤, 每秒鐘都要更新每支股票的變化
一共有1500支左右的A股, 包括上證A股和深證A股
試了新浪的接口, 只能一次最多查150支股票左右
用PHP寫好了程序, 單進程采集, 更新完這1500支, 平均需要
20.5953 seconds. 0.37MB memory usage還不算數據庫更新, 還沒有試多進程, 反正也不太具備實用價值, 這方法本身就有問題
而且每秒要向新浪發起10次查詢, 不知道丫的會不會封我IP...
和webxml的技術聯系了, 丫的還不如新浪, 一次只能查詢40支, 而且要錢, 不限查詢給我打完折一年要我1萬人民幣.
最終, 還是讓我找到了解決辦法, 方法....我保密, 商業價值還是比較高的. 實現了最小輸據量傳輸的實時行情同步.
沒有優化的情況下, 一秒同步采集一次時, 需要占用1.5M帶寬, 一次同步需要0.3-0.4秒左右的時間.
優化完后, 一秒同步采集一次, 峰值是1.5M, 不過占用時間很短.
明天繼續搞數據庫部份, 看來要在空閑時間再入庫了. 從而形成歷史數據庫.
有一個思路, 就是用現有的股票軟件, 破解其現有的查詢渠道, 開發一個專門生成行情數據的程序.
搜索了半天, 一個叫大贏家的在搞這個, 數據項比較多, 收費不低, 好像是2,3萬, 看他介紹還不錯的, 東西是不是那么好就不知道了.
關于速度
以新浪為例, 新浪網頁上默認的刷新時間是5秒, 如果服務器上要跟它數據保持同步, 需要注意服務器端跟新浪的連接速度要快
查詢次數如果過多, 不知道會不會封IP. 不過普通訪客都有5秒間隔查詢的權限, 如果要一秒一次, 那加4個速度同樣的代理就可以解決了:)
另外注意文件鎖的問題
數據量 = 1500支 * (4*60/3) = 12萬
(按每股3秒變動一次算一天開盤4小時)
每開盤一天, 估計數據庫要增加12萬條記錄, 數據庫, 表, 字段要規劃好, 準備使用MYSQL或SQLITE
今天沒開盤, 等明天開了盤, 搞了數據庫再說吧
我之所以開始這個題目,是因為我又看到有人問起如何從WEB中取數據了。隨著炒股的人越來越多,可能很多人喜歡用EXCEL來分析股票信息。可是,如何得到股價信息呢?這又是一個問題。
我之前看到的程序,都是從類似business.sohu.com或finance.sina.com.cn中取數據。用XMLHTTP讀取大段的網頁然后進行數據分離。這種做是對的,但是卻不是最快的。要知道用XMLHTTP讀取數據的過程,其實就是你打開網頁的過程。你打開網頁有多快,XMLHTTP就有多快。因此,如何獲取最低層的那個GET是最重要的。經過一段時間的努力,我找到了金融街網站的股票數據信息的最底層的那個GET,速度快,底層的返回數據沒有一句http語言,純文本,易于處理。
現在就將這兩個函數公開,希望能對用到的朋友提供一點幫助。
對于其他網頁數據的獲取,請參照下面的GetHttp函數。只需要在函數參數中加入自己的網址就行了。另外,如果你是經常需要從不同的網頁獲取數據,為了便于處理得到的文本,建議學習一下“正則表達式”,我們論壇上用的。
好了,言歸正傳。下面就介紹這兩個函數。
取金融街某支股票當天數據的函數Jrj0DayData
? 函數使用說明
?參數StockCode輸入股票代碼
?函數以數組形式返回當天數據
Function Jrj0DayData(ByRef StockCode As String)
??
??? Dim Url As String
??
??? Url = " http://quote.jrj.com.cn/htmdata/html/" & StockCode & ".htm"
??? Url = GetHttp(Url)
??? Jrj0DayData = Split(Url, ",")
??
End Function
返回的數組有元素38個,數組元素含義如下:
數組的各元素的含義如下所示:
??? Debug.Print "日期" & arrA(1)
??? Debug.Print "時間" & arrA(2)
??? Debug.Print "成交價" & arrA(3)
??? Debug.Print "現手" & arrA(4)
??? Debug.Print "漲跌" & arrA(5)
??? Debug.Print "幅度" & arrA(6)
??? Debug.Print "均價" & arrA(7)
??? Debug.Print "總量" & arrA(8)
??? Debug.Print "金額" & arrA(9)
??? Debug.Print "主買或外盤" & arrA(10)
??? Debug.Print "主賣或內盤" & arrA(11)
??? Debug.Print "昨收" & arrA(12)
??? Debug.Print "開盤" & arrA(13)
??? Debug.Print "最高" & arrA(14)
??? Debug.Print "最低" & arrA(15)
??? Debug.Print "委比" & arrA(16)
??? Debug.Print "委差" & arrA(17)
??? Debug.Print "量比" & arrA(18)
??? '下面的格式就是買賣交替,從19-38
??? Debug.Print "買①" & arrA(19)
??? Debug.Print "買①量" & arrA(20)
??? Debug.Print "賣①" & arrA(21)
??? Debug.Print "賣①量" & arrA(22)
可以說,這一個數組已經包括了某支股票當日的基本信息,比較全了。
第二個函數,獲取歷史價格信息
金融街取某一股票80天數據的函數
用法:參數StockCode輸入某股票代碼。函數以數組形式返回80天數據,數組每個元素中存貯著類似(2007-04-20? 開:48.23? 高:50.79? 低:48.00? 收:50.27? 量:461974? 額:228812.67 )的數據。
Function Jrj80DayData(ByRef StockCode As String)
??
??? Dim Url As String
??? Dim objREGEXP As Object
??
??? Url = " http://chart.jrj.com/htmdata/KLINE/ " & StockCode & ".js"
??? Url = GetHttp(Url)
??
??? Set objREGEXP = CreateObject("VBSCRIPT.REGEXP")
??? With objREGEXP
?
??????? .Global = True
??????? .Pattern = "[a\[][^\]]*[\]]"
??????? Url = .Replace(Url, "")
??????
??? End With
??? Set objREGEXP = Nothing
??
??? Url = Replace(Url, "= ", "")
??? Url = Replace(Url, """", "")
??? Url = Replace(Url, Chr(13), "")
??? Url = Replace(Url, ";", "")
??
??? Jrj80DayData = Split(Url, Chr(10))
??
End Function
函數返回的數組有80個元素,從0-79中依次存著類似2007-04-20? 開:48.23? 高:50.79? 低:48.00? 收:50.27? 量:461974? 額:228812.67 這樣的內容。至于你要事先顯示此字符串還是要只取數據進行分析,那就隨你自己了。
前面兩個函數的運用,是要用到下面的這兩個函數的。這兩個函數是必須的。一個是xmlhttp組件的運用,一個是糾正亂碼的。
Function GetHttp(Url)
??? Dim objXML
??? On Error Resume Next
??? Set objXML = CreateObject("Microsoft.XMLHTTP")
??? With objXML
??????? .Open "Get", Url, False, "", ""
??????? .Send
??????? GetHttp = .ResponseBody
??? End With
??? GetHttp = BytesToBstr(GetHttp, "GB2312")
??? Set objXML = Nothing
??? On Error GoTo 0
End Function
Function BytesToBstr(strBody, CodeBase)
??? Dim objStream
??? Set objStream = CreateObject("Adodb.Stream")
??
??? With objStream
??????? .Type = 1
??????? .Mode = 3
??????? .Open
??????? .Write strBody
??????? .Position = 0
??????? .Type = 2
??????? .Charset = CodeBase
??????? BytesToBstr = .ReadText
??? End With
??? objStream.Close
??? Set objStream = Nothing
End Function
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
