网页取行情数据-2
2016-05-09 15:56
435 查看
方案3
门户网站获取行情
Sina股票数据接口 (股票见网上http://www.cnblogs.com/luluping/archive/2010/11/15/1877817.html)
期指内容:
分析网页 http://finance.sina.com.cn/futures/quotes/IC1605.shtml
获取接口 hq.sinajs.cn/?&list=CFF_RE_IC1605
可以看到行情时间,延迟15分钟 ……
分析字段,依次为: 今开,最高,最低,现价,总量,总额,持仓,收盘,结算,涨停,跌停,(-),(-),昨收,昨结,昨持仓,0,0
可惜结算价的更新太慢了……,且没有按照日期获取数据。
方案4
去中金所(www.cffex.com.cn)、上期所(www.shfe.com.cn),大商所(www.dce.com.cn) 和 郑商所(www.czce.com.cn)
抓取:
其中中金所的数据是xml格式的 http://www.cffex.com.cn/fzjy/mrhq/201604/26/index.xml
上期所的数据是json格式的 http://www.shfe.com.cn/data/dailydata/kx/kx20160426.dat
大商与郑商是 表格http://www.dce.com.cn/PublicWeb/MainServlet?action=Pu00011_result&Pu00011_Input.trade_type=0&Pu00011_Input.trade_date=20160425&Pu00011_Input.variety=all
http://www.czce.com.cn/portal/DFSStaticFiles/Future/2016/20160425/FutureDataDaily.htm
部分vba代码如下:
网上找的一个json类解析模块 (内部使用dictionary 解析json字符串) 见后面
json解析
子函数,获取网页数据
结论:3大期货交易所的数据还算及时,但是中金所更新太慢了。
附上vbsjson类模块
门户网站获取行情
Sina股票数据接口 (股票见网上http://www.cnblogs.com/luluping/archive/2010/11/15/1877817.html)
期指内容:
分析网页 http://finance.sina.com.cn/futures/quotes/IC1605.shtml
获取接口 hq.sinajs.cn/?&list=CFF_RE_IC1605
var hq_str_CFF_RE_IC1605="5830.00,5837.00,5633.20,5652.80,15386,17623900000,22198,5652.80,,6525.80,5339.40,,,5887.80,5932.60,23189,0,0,--,--,--,--,--,--,--,--,0,0,--,--,--,--,--,--,--,--,2016-05-09,15:00:15,0,1,6156.400,5798.000,6156.400,5686.600,6248.400,5686.600,6248.400,5550.000,151.093";
可以看到行情时间,延迟15分钟 ……
分析字段,依次为: 今开,最高,最低,现价,总量,总额,持仓,收盘,结算,涨停,跌停,(-),(-),昨收,昨结,昨持仓,0,0
可惜结算价的更新太慢了……,且没有按照日期获取数据。
方案4
去中金所(www.cffex.com.cn)、上期所(www.shfe.com.cn),大商所(www.dce.com.cn) 和 郑商所(www.czce.com.cn)
抓取:
其中中金所的数据是xml格式的 http://www.cffex.com.cn/fzjy/mrhq/201604/26/index.xml
上期所的数据是json格式的 http://www.shfe.com.cn/data/dailydata/kx/kx20160426.dat
大商与郑商是 表格http://www.dce.com.cn/PublicWeb/MainServlet?action=Pu00011_result&Pu00011_Input.trade_type=0&Pu00011_Input.trade_date=20160425&Pu00011_Input.variety=all
http://www.czce.com.cn/portal/DFSStaticFiles/Future/2016/20160425/FutureDataDaily.htm
部分vba代码如下:
On Error GoTo xmlerr Dim xmldom As Object, node As Object, nod As Object Set xmldom = CreateObject("Microsoft.XMLDOM") ' xmldom.setProperty "SelectionLanaguage", "XPath" 'xpath才支持contains, startwith等函数 ' 增加xpath的支持,且必须在load完后,否则直接异常,vba内无异常捕获 xmldom.async = False xmldom.Load url xmldom.setProperty "SelectionLanguage", "XPath" Set node = xmldom.SelectSingleNode("dailydatas//dailydata[contains(instrumentid,'" & iid & "')]") If node Is Nothing Then xmlWeb = Array(CVErr(xlErrNull), CVErr(xlErrNull), CVErr(xlErrNull)) Exit Function End If 'Set xmlnodes = xmldom.getElementsByTagName("dailydata") 'Set Nodes = xmldom.SelectNodes("//dailydata") For Each nod In node.ChildNodes If nod.nodename = "settlementprice" Then sprice = nod.Text 'ElseIf nod.nodename = "openprice" Then ' oprice = nod.Text ElseIf nod.nodename = "presettlementprice" Then lsprice = nod.Text ElseIf nod.nodename = "closeprice" Then cprice = nod.Text End If Next xmlWeb = Array(cprice, sprice, lsprice)
网上找的一个json类解析模块 (内部使用dictionary 解析json字符串) 见后面
json解析
Private Function jsonWeb(url As String, iid As String) As Variant() Dim lsprice As Currency Dim cprice As Currency Dim sprice As Currency Dim p As Object, js As String Dim o 'Dictionary Dim ics() Dim ic 'Dictionary On Error GoTo jsonerr: Call getWeb(url, js) If js = "" Then Exit Function Set p = New vbsJson Set o = p.Decode(js) 'Set c = o.Item("o_curinstrument") ics = o.Item("o_curinstrument") For Each ic In ics If Left(ic.Item("PRODUCTID"), Len(iid) - 2) = LCase(Left(iid, Len(iid) - 4)) & "_f" And ic.Item("DELIVERYMONTH") = Right(iid, 4) Then lsprice = ic.Item("PRESETTLEMENTPRICE") cprice = ic.Item("CLOSEPRICE") sprice = ic.Item("SETTLEMENTPRICE") End If Next jsonWeb = Array(cprice, sprice, lsprice)
子函数,获取网页数据
Public Sub getWeb(url As String, ByRef response As String) On Error GoTo ehl ' With ActiveSheet.QueryTables.add( _ ' Connection := "Text;" Dim httpreq As Object Set httpreq = CreateObject("MSXML2.XMLHTTP") httpreq.Open "GET", url, False '.setRequestHeader "Content-Type", "text/html;charset=UTF-8" ' "application/x-www-form-urlencoded; charset=UTF-8" '.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" '.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8" ' .setRequestHeader "Accept-Language", "zh-CN,zh;q=0.8" '.setRequestHeader "charset", "gbk" httpreq.send While httpreq.ReadyState <> 4 DoEvents Wend response = httpreq.responseText 'strText 'U8SToUnicode(StrConv(strText, vbUnicode)) Set httpreq = Nothing Exit Sub ehl: MsgBox Err.Description End Sub
结论:3大期货交易所的数据还算及时,但是中金所更新太慢了。
附上vbsjson类模块
'Class vbsJson 'Author: Demon 'Date: 2012/5/3 'Website: http://demon.tw Private Whitespace, NumberRegex, StringChunk Private b, f, r, n, t Private Sub Class_Initialize() Whitespace = " " & vbTab & vbCr & vbLf b = ChrW(8) f = vbFormFeed r = vbCr n = vbLf t = vbTab Set NumberRegex = CreateObject("VBScript.RegExp") NumberRegex.Pattern = "(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?" NumberRegex.Global = False NumberRegex.MultiLine = True NumberRegex.IgnoreCase = True Set StringChunk = CreateObject("VBScript.RegExp") 'New RegExp StringChunk.Pattern = "([\s\S]*?)([""\\\x00-\x1f])" StringChunk.Global = False StringChunk.MultiLine = True StringChunk.IgnoreCase = True End Sub 'Return a JSON string representation of a VBScript data structure 'Supports the following objects and types '+-------------------+---------------+ '| VBScript | JSON | '+===================+===============+ '| Dictionary | object | '+-------------------+---------------+ '| Array | array | '+-------------------+---------------+ '| String | string | '+-------------------+---------------+ '| Number | number | '+-------------------+---------------+ '| True | true | '+-------------------+---------------+ '| False | false | '+-------------------+---------------+ '| Null | null | '+-------------------+---------------+ Public Function Encode(ByRef obj) Dim buf, i, c, g Set buf = CreateObject("Scripting.Dictionary") Select Case VarType(obj) Case vbNull buf.Add buf.Count, "null" Case vbBoolean If obj Then buf.Add buf.Count, "true" Else buf.Add buf.Count, "false" End If Case vbInteger, vbLong, vbSingle, vbDouble buf.Add buf.Count, obj Case vbString buf.Add buf.Count, """" For i = 1 To Len(obj) c = mid(obj, i, 1) Select Case c Case """" buf.Add buf.Count, "\""" Case "\" buf.Add buf.Count, "\\" Case "/" buf.Add buf.Count, "/" Case b buf.Add buf.Count, "\b" Case f buf.Add buf.Count, "\f" Case r buf.Add buf.Count, "\r" Case n buf.Add buf.Count, "\n" Case t buf.Add buf.Count, "\t" Case Else If AscW(c) >= 0 And AscW(c) <= 31 Then c = Right("0" & Hex(AscW(c)), 2) buf.Add buf.Count, "\u00" & c Else buf.Add buf.Count, c End If End Select Next buf.Add buf.Count, """" Case vbArray + vbVariant g = True buf.Add buf.Count, "[" For Each i In obj If g Then g = False Else buf.Add buf.Count, "," buf.Add buf.Count, Encode(i) Next buf.Add buf.Count, "]" Case vbObject If TypeName(obj) = "Dictionary" Then g = True buf.Add buf.Count, "{" For Each i In obj If g Then g = False Else buf.Add buf.Count, "," buf.Add buf.Count, """" & i & """" & ":" & Encode(obj(i)) Next buf.Add buf.Count, "}" Else Err.Raise 8732, , "None dictionary object" End If Case Else buf.Add buf.Count, """" & CStr(obj) & """" End Select Encode = Join(buf.Items, "") End Function 'Return the VBScript representation of ``str(`` 'Performs the following translations in decoding '+---------------+-------------------+ '| JSON | VBScript | '+===============+===================+ '| object | Dictionary | '+---------------+-------------------+ '| array | Array | '+---------------+-------------------+ '| string | String | '+---------------+-------------------+ '| number | Double | '+---------------+-------------------+ '| true | True | '+---------------+-------------------+ '| false | False | '+---------------+-------------------+ '| null | Null | '+---------------+-------------------+ Public Function Decode(ByRef str) Dim idx idx = SkipWhitespace(str, 1) If mid(str, idx, 1) = "{" Then Set Decode = ScanOnce(str, 1) Else Decode = ScanOnce(str, 1) End If End Function Private Function ScanOnce(ByRef str, ByRef idx) Dim c, ms idx = SkipWhitespace(str, idx) c = mid(str, idx, 1) If c = "{" Then idx = idx + 1 Set ScanOnce = ParseObject(str, idx) Exit Function ElseIf c = "[" Then idx = idx + 1 ScanOnce = ParseArray(str, idx) Exit Function ElseIf c = """" Then idx = idx + 1 ScanOnce = ParseString(str, idx) Exit Function ElseIf c = "n" And StrComp("null", mid(str, idx, 4)) = 0 Then idx = idx + 4 ScanOnce = Null Exit Function ElseIf c = "t" And StrComp("true", mid(str, idx, 4)) = 0 Then idx = idx + 4 ScanOnce = True Exit Function ElseIf c = "f" And StrComp("false", mid(str, idx, 5)) = 0 Then idx = idx + 5 ScanOnce = False Exit Function End If Set ms = NumberRegex.Execute(mid(str, idx)) If ms.Count = 1 Then idx = idx + ms(0).Length ScanOnce = CDbl(ms(0)) Exit Function End If Err.Raise 8732, , "No JSON object could be ScanOnced" End Function Private Function ParseObject(ByRef str, ByRef idx) Dim c, key, value Set ParseObject = CreateObject("Scripting.Dictionary") idx = SkipWhitespace(str, idx) c = mid(str, idx, 1) If c = "}" Then Exit Function ElseIf c <> """" Then Err.Raise 8732, , "Expecting property name" End If idx = idx + 1 Do key = ParseString(str, idx) idx = SkipWhitespace(str, idx) If mid(str, idx, 1) <> ":" Then Err.Raise 8732, , "Expecting : delimiter" End If idx = SkipWhitespace(str, idx + 1) If mid(str, idx, 1) = "{" Then Set value = ScanOnce(str, idx) Else value = ScanOnce(str, idx) End If ParseObject.Add key, value idx = SkipWhitespace(str, idx) c = mid(str, idx, 1) If c = "}" Then Exit Do ElseIf c <> "," Then Err.Raise 8732, , "Expecting , delimiter" End If idx = SkipWhitespace(str, idx + 1) c = mid(str, idx, 1) If c <> """" Then Err.Raise 8732, , "Expecting property name" End If idx = idx + 1 Loop idx = idx + 1 End Function Private Function ParseArray(ByRef str, ByRef idx) Dim c, values, value Set values = CreateObject("Scripting.Dictionary") idx = SkipWhitespace(str, idx) c = mid(str, idx, 1) If c = "]" Then ParseArray = values.Items Exit Function End If Do idx = SkipWhitespace(str, idx) If mid(str, idx, 1) = "{" Then Set value = ScanOnce(str, idx) Else value = ScanOnce(str, idx) End If values.Add values.Count, value idx = SkipWhitespace(str, idx) c = mid(str, idx, 1) If c = "]" Then Exit Do ElseIf c <> "," Then Err.Raise 8732, , "Expecting , delimiter" End If idx = idx + 1 Loop idx = idx + 1 ParseArray = values.Items End Function Private Function ParseString(ByRef str, ByRef idx) Dim chunks, content, terminator, ms, esc, char Set chunks = CreateObject("Scripting.Dictionary") Do Set ms = StringChunk.Execute(mid(str, idx)) If ms.Count = 0 Then Err.Raise 8732, , "Unterminated string starting" End If content = ms(0).Submatches(0) terminator = ms(0).Submatches(1) If Len(content) > 0 Then chunks.Add chunks.Count, content End If idx = idx + ms(0).Length If terminator = """" Then Exit Do ElseIf terminator <> "\" Then Err.Raise 8732, , "Invalid control character" End If esc = mid(str, idx, 1) If esc <> "u" Then Select Case esc Case """" char = """" Case "\" char = "\" Case "/" char = "/" Case "b" char = b Case "f" char = f Case "n" char = n Case "r" char = r Case "t" char = t Case Else Err.Raise 8732, , "Invalid escape" End Select idx = idx + 1 Else char = ChrW("&H" & mid(str, idx + 1, 4)) idx = idx + 5 End If chunks.Add chunks.Count, char Loop ParseString = Join(chunks.Items, "") End Function Private Function SkipWhitespace(ByRef str, ByVal idx) Do While idx <= Len(str) And _ InStr(Whitespace, mid(str, idx, 1)) > 0 idx = idx + 1 Loop SkipWhitespace = idx End Function 'End Class
相关文章推荐
- 个人常见手误问题集锦
- puppet 安装
- Tomcat集群配置学习篇-----分布式应用
- 数组金额 转 大写
- formvalidate默认验证规则
- Linux下查看并下载命令源码包(根据命令/应用程序逆向获取并且安装其所属源码包)
- 常用sql 总结1 2016-04-21
- iOS字体包导入过程
- pdf转换成jpg格式的转换方法
- 关于跨程序集的反射(续)
- php模块化供前端ajax调用的实现
- (2.1.19.5)深入理解Java:注解(Annotation)--注解处理器
- Android 实现一键切换应用主题颜色
- CUGOJ 1681 求解最长回文字符串
- ubuntu安装卸载和查看已安装软件
- Android通过Get方式提交数据的乱码处理
- MySQL学习9:详解MySQL中的外键约束
- 某些情况下 push pop动画失效的处理
- java验证码组件Jcaptcha
- JobConf