Web Service是一种新的Web应用程序分支,其可以执行从简单的请求到复杂商务处理的任何功能。Web Service技术使得运行在不同机器上的不同应用进行数据交互或集成。
1、Web Service简介
Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。Web Service的主要目标是跨平台的可互操作性。为了实现这一目标,Web Service 完全基于XML(可扩展标记语言)、XSD(XML Schema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
应用程序接口(API:application programming interface)是一组定义、程序及协议的集合,通过 API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。程序员通过使用 API 函数开发应用程序,从而可以避免编写无用程序,以减轻编程任务。
2、腾讯股票实时数据
腾讯提供相等稳定、免费的股票即时数据Web Service API接口,分为股票实时数据详细信息和简要信息。
I、股票实时数据详细信息
接口:http://qt.gtimg.cn/q=sh601006
返回值:
v_sh601006="1~大秦铁路~601006~7.48~7.43~7.43~260548~145815~114733~7.47~590~7.46~4407~7.45~3851~7.44~1062~7.43~3079~7.48~686~7.49~4629~7.50~6627~7.51~2656~7.52~2393~~20230703155612~0.05~0.67~7.50~7.39~7.48/260548/194083793~260548~19408~0.17~9.53~~7.50~7.39~1.48~1132.80~1132.80~0.86~8.17~6.69~0.85~-4002~7.45~7.75~10.12~~~0.54~19408.3793~0.0000~0~ ~GP-A~11.98~3.46~6.30~9.00~6.66~8.21~5.95~0.13~-1.06~4.03~15144408989~15144408989~-13.35~11.98~15144408989~~~22.02~0.00~~CNY~0~___D__F__N";7.40~-3.77~4.15~22.45~18.52~216.11~128.55~-3.24~1.50~-14.46~3881525907~3881608005~-30.63~-1.94~3881525907~~~-12.97~-0.15~~CNY~0~___D__F__N";
注:腾讯股票实时行情数据接口网址中“sh”表示上海、“sz”表示深圳。如,“sh600653”为上证交易所的“申华控股”、“sz000021”为深圳交易所“深科技”;以 “~” 分割字符串中内容,下标从0开始
这个字符串由许多数据拼接在一起,不同含义的数据用逗号隔开了,对于网页前台程序员来说,这就是定义好的格式化字符变量。按数据循序具体含义为:
[0] 证券所 [1] 名字 [2] 代码 [3] 当前价格 [4] 昨收 [5] 今开 [6] 成交量(手) [7] 外盘 [8] 内盘 [9] 买一 [10] 买一量(手) [11] 买二 [12] 买二量 [13] 买三 [14] 买三量 | [15] 买四 [16] 买四量 [17] 买五 [18] 买五量 [19] 卖一 [20] 卖一量 [21] 卖二 [22] 卖二量 [23] 卖三 [24] 卖三量 [25] 卖四 [26] 卖四量 [27] 卖五 [28] 卖五量 [29] 最近逐笔成交 | [30] 时间 [31] 涨跌 [32] 涨跌幅(%) [33] 最高 [34] 最低 [35] 价格/成交量(手)/成交额 [36] 成交量(手) [37] 成交额(万) [38] 换手率 [39] 市盈率(TTM) [40] [41] 最高 [42] 最低 [43] 振幅 [44] 流通市值 | [45] 总市值 [46] 市净率 [47] 涨停价 [48] 跌停价 [49] 量比 [50] [51] 均价 [52] 市盈率(动) [53] 市盈率(静) |
II、股票实时数据简要信息
接口:http://qt.gtimg.cn/q=s_sh601006
返回值:
v_s_sh601006="1~大秦铁路~601006~7.48~0.05~0.67~260548~19408~~1132.80~GP-A";
具体含义为:
[0] 未知 [1] 名字 [2] 代码 | [3]当前价格 [4]涨跌 [5]涨跌% | [6]成交量(手) [7]成交额(万) [8] 总市值 |
6秒是交易所发给常规会员单位的实时数据刷新时间间隔!会员单位一般都追求0延迟,交易所有多快他们就尽量做到有多快; 对于转接数据或者N手转让数据,这个6秒就不能够保证了,一般会更长。 如果你发现是一分钟更新一次的话 那说明他们后台在以60秒为单位自行打包接收到的数据。 这个现象在一些中小网站的页面报价中也存在,具体时间间隔 由他们自己划定。
3、实时数据抓取
这里我们介绍抓取腾讯股票实时数据简要信息。
I、股票选择
在sheet1表格中选择感兴趣的股票(股票池),如图:
必要的信息是股票代码和名称,其它列信息根据自己的要求标注即可。沪深两市上市交易股票数量有5000多只,选择抓取股票的数量取决于用户特点、网络传输速度和电脑性能等多种因素。
在sheet3表格中选择主要股票指数和ETF基金指数,如图:
II、数据抓取窗体即功能
建立窗体如下图:
注:窗体UserForm1的ShowModel属性设为False,使得打开窗体后可切换到EXCEL表格中
- CommandButton1:【数据抓取】命令按钮;
- TextBox1:文本框,打开窗体时显示选股数,运行时显示序号;
- TextBox2:文本框,鼠标点击sheet1或sheet3中的代码所在单元格,WebBrowser1网页控件显示所选代码历史数据图形;
- ComboBox1:复合框控件,下拉可选不同类型图形;
- WebBrowser1:网页控件。
运行结果如下:
点击【数据抓取】按钮,按sheet1所列股票代码抓取实时交易信息(抓取进程序号显示在)在sheet2中,如图:
按sheet3所列股票指数代码抓取实时交易信息在sheet4中,如图:
点击【数据抓取】按钮如果弹出下面警告窗口,按【确定】即可。
III、VBA代码
窗体初始化事件代码:
Private Sub UserForm_Initialize()
'WebBrowser1控件加载上证指数分时线图形
WebBrowser1.Navigate "http://image.sinajs.cn/newchart/min/n/sh000001.gif"
'复合框初始化
ComboBox1.AddItem "分时线"
ComboBox1.AddItem "日K线"
ComboBox1.AddItem "周K线"
ComboBox1.AddItem "月K线"
ComboBox1.ListIndex = 0
'计算要抓取的股票和指数数量和
TextBox1.Value = Sheet1.UsedRange.Rows.Count + Sheet3.UsedRange.Rows.Count - 4
End Sub
点击【数据抓取】代码:
Private Sub CommandButton1_Click()
Dim i, k As Integer
Dim ID As String
Dim str As String
Dim URL As String
Dim app, wb, wc
'建立Application对象
Set app = CreateObject("Excel.Application")
Sheet2.Cells.Clear
Sheet2.Cells(1, 1) = "代码"
Sheet2.Cells(1, 2) = "名称"
Sheet2.Cells(1, 3) = "实时价格"
Sheet2.Cells(1, 4) = "涨跌"
Sheet2.Cells(1, 5) = "涨跌(%)"
k = Sheet1.UsedRange.Rows.Count
For i = 1 To k - 1
ID = Sheet1.Cells(i + 1, 1) '设置股票代码
URL = "http://qt.gtimg.cn/q=s_" & ID '构造新浪股票实时行情数据接口地址
Set wb = app.Workbooks.Open(URL) '由当前工作簿打开数据接口
Set wc = wb.Sheets.Item(1)
'提取数据接口返回的文本信息
str = wc.Cells(1, 1).Text
Sheet2.Cells(i + 1, 1) = ID
Sheet2.Cells(i + 1, 2) = Split(str, "~")(1)
Sheet2.Cells(i + 1, 3) = Split(str, "~")(3)
Sheet2.Cells(i + 1, 4) = Split(str, "~")(4)
Sheet2.Cells(i + 1, 5) = Split(str, "~")(5)
Next i
Sheet4.Cells.Clear
Sheet4.Cells(1, 1) = "代码"
Sheet4.Cells(1, 2) = "名称"
Sheet4.Cells(1, 3) = "实时价格"
Sheet4.Cells(1, 4) = "涨跌"
Sheet4.Cells(1, 5) = "涨跌(%)"
k = Sheet3.UsedRange.Rows.Count
For i = 1 To 8
ID = Sheet3.Cells(i + 1, 1)
URL = "http://qt.gtimg.cn/q=s_" & ID
Set wb = app.Workbooks.Open(URL)
Set wc = wb.Sheets.Item(1)
str = wc.Cells(1, 1).Text
Sheet4.Cells(i + 1, 1) = ID
Sheet4.Cells(i + 1, 2) = Split(str, "~")(1)
Sheet4.Cells(i + 1, 3) = Split(str, "~")(3)
Sheet4.Cells(i + 1, 4) = Split(str, "~")(4)
Sheet4.Cells(i + 1, 5) = Split(str, "~")(5)
TextBox1.Value = i
Next i
End Sub
点击sheet1第一列股票代码显示图形代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim r, c
'获得单元格所在行
r = Target.Row
'获得单元格所在列
c = Target.Column
'调用子过程setChart( r, c, 1),第3个参数为常数1,表示点击的是sheet1
setChart r, c, 1
End Sub
点击sheet3第一列股指数票代码显示图形代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim r, c
r = Target.Row
c = Target.Column
setChart r, c, 3
End Sub
模块1中用子过程setChart代码:
Sub setChart(r, c, p)
Dim s As Integer
Dim ID As String
If c = 1 And r > 1 Then
If p = 1 Then
ID = Sheet1.Cells(r, 1)
Else
ID = Sheet3.Cells(r, 1)
End If
End If
s = UserForm1.ComboBox1.ListIndex
If s = 0 Then UserForm1.WebBrowser1.Navigate "http://image.sinajs.cn/newchart/min/n/" & ID & ".gif"
If s = 1 Then UserForm1.WebBrowser1.Navigate "http://image.sinajs.cn/newchart/daily/n/" & ID & ".gif"
If s = 2 Then UserForm1.WebBrowser1.Navigate "http://image.sinajs.cn/newchart/weekly/n/" & ID & ".gif"
If s = 3 Then UserForm1.WebBrowser1.Navigate "http://image.sinajs.cn/newchart/monthly/n/" & ID & ".gif"
End Sub
代码中,"http://image.sinajs.cn/newchart/..."为新浪股票图形接口地址,
- 新浪股票分时线: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"
将上证指数代码”sh000001“替换为其它股票代码,可显示不同股票所列图形。
下拉框选择不同类图形代码:
Dim r, c, p
'当前单元格所在行
r = ActiveCell.Row
'当前单元格所在列
c = ActiveCell.Column
'当前表格序号
p = ActiveWindow.ActiveSheet.Index
setChart r, c, p
打开窗体,鼠标选择sheet1中茅台酒股票代码”sh600519“,如图:
下拉框选择日K线:
下拉框选择周K线:
下拉框选择月K线:
用户可根据自己的判断选择感兴趣的股票进行实时监控,数据抓取刷新后可在其它表格(如sheet5、sheet6等)通过跨表格数据引用进行进一步处理、分析,对个别感兴趣的股票也可以通过不同类图形观察其历史变化趋势。
通过VBA Application对象抓取股票实时数据的效率不是特别理想,优点是不需要解析网页文档,对于不熟悉网页编程的用户不失为一种好的解决方案。