天天看點

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

作者:銀河統計工作室

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表格中選擇感興趣的股票(股票池),如圖:

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

必要的資訊是股票代碼和名稱,其它列資訊根據自己的要求标注即可。滬深兩市上市交易股票數量有5000多隻,選擇抓取股票的數量取決于使用者特點、網絡傳輸速度和電腦性能等多種因素。

在sheet3表格中選擇主要股票指數和ETF基金指數,如圖:

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

II、資料抓取窗體即功能

建立窗體如下圖:

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

注:窗體UserForm1的ShowModel屬性設為False,使得打開窗體後可切換到EXCEL表格中

  • CommandButton1:【資料抓取】指令按鈕;
  • TextBox1:文本框,打開窗體時顯示選股數,運作時顯示序号;
  • TextBox2:文本框,滑鼠點選sheet1或sheet3中的代碼所在單元格,WebBrowser1網頁控件顯示所選代碼曆史資料圖形;
  • ComboBox1:複合框控件,下拉可選不同類型圖形;
  • WebBrowser1:網頁控件。

運作結果如下:

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

點選【資料抓取】按鈕,按sheet1所列股票代碼抓取實時交易資訊(抓取程序式号顯示在)在sheet2中,如圖:

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

按sheet3所列股票指數代碼抓取實時交易資訊在sheet4中,如圖:

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

點選【資料抓取】按鈕如果彈出下面警告視窗,按【确定】即可。

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

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“,如圖:

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

下拉框選擇日K線:

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

下拉框選擇周K線:

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

下拉框選擇月K線:

通過VBA Application對象抓取騰訊股票實時資料 - EXCEL VBA(24)

使用者可根據自己的判斷選擇感興趣的股票進行實時監控,資料抓取重新整理後可在其它表格(如sheet5、sheet6等)通過跨表格資料引用進行進一步處理、分析,對個别感興趣的股票也可以通過不同類圖形觀察其曆史變化趨勢。

通過VBA Application對象抓取股票實時資料的效率不是特别理想,優點是不需要解析網頁文檔,對于不熟悉網頁程式設計的使用者不失為一種好的解決方案。

繼續閱讀