网页取行情数据-2

方案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

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
时间: 2024-10-05 23:25:06

网页取行情数据-2的相关文章

网页取行情数据-1

起因是从 数据提供商取到的股指期货的结算价更新比较晚,一般收盘后还是昨天的数据. 而页面更新后接口基本还要延迟个半个多小时,就想试试从网页上抓取. 目前没有很好的办法,记录下这几天的集中尝试思路: 1. 从通达信上抓取: 股票,网上有个tdxHqApi.dll,  存在有效期,可以获取股票的行情数据. 股指期货,传说中的tdxExHq.dll, 没有找到,但某网站提供了一个demo,这个demo确实取到了数据. 网上找到的接口如下: //开发文档 // //1.行情API均是TdxHqApi.d

Java抓取网页数据(原网页+Javascript返回数据)

转载请注明出处! 原文链接:http://blog.csdn.net/zgyulongfei/article/details/7909006 有时候因为种种原因,我们须要採集某个站点的数据,但因为不同站点对数据的显示方式略有不同! 本文就用Java给大家演示怎样抓取站点的数据:(1)抓取原网页数据:(2)抓取网页Javascript返回的数据. 一.抓取原网页. 这个样例我们准备从http://ip.chinaz.com上抓取ip查询的结果: 第一步:打开这个网页,然后输入IP:111.142.

Wireshark学习笔记——如何快速抓取HTTP数据包

0.前言 在火狐浏览器和谷歌浏览器中可以非常方便的调试network(抓取HTTP数据包),但是在360系列浏览器(兼容模式或IE标准模式)中抓取HTTP数据包就不那么那么方便了.虽然也可使用HttpAnalyzer等工,但是毕竟都是收费软件.只需通过合适的过滤和操作,Wireshark也可抓取HTTP请求和响应.下面便说明具体操作. 假设在8080端口运行一个HTTP服务器,本例中使用Python Flask运行一个HTTP服务并侦听8080端口,实现一个简单的加法运算,网页中通过ajax提交

iOS—网络实用技术OC篇&amp;网络爬虫-使用java语言抓取网络数据

网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一片文章已经介绍我们可以使用两个方式来抓取网络数据实现网络爬虫,并且大致介绍了一下怎么使用正则表达式去实现数据的抓取 由于笔者曾经学过一段时间java和android相关的技术,今天就讲讲怎么使用java去抓取网络数据,关于Python有机会等笔者好好研究一下再来分享,但其实会一种就可以,除非你的需求

iOS开发——网络使用技术OC篇&amp;网络爬虫-使用正则表达式抓取网络数据

网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看看网络爬虫的基本原理: 一个通用的网络爬虫的框架如图所示: 网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL: 2.将这些URL放入待抓取URL队列: 3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中.

iOS开发——网络实用技术OC篇&amp;网络爬虫-使用java语言抓取网络数据

网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一片文章已经介绍我们可以使用两个方式来抓取网络数据实现网络爬虫,并且大致介绍了一下怎么使用正则表达式去实现数据的抓取 由于笔者曾经学过一段时间java和android相关的技术,今天就讲讲怎么使用java去抓取网络数据,关于Python有机会等笔者好好研究一下再来分享,但其实会一种就可以,除非你的需求

【python网络编程】新浪爬虫:关键词搜索爬取微博数据

上学期参加了一个大数据比赛,需要抓取大量数据,于是我从新浪微博下手,本来准备使用新浪的API的,无奈新浪并没有开放关键字搜索的API,所以只能用爬虫来获取了.幸运的是,新浪提供了一个高级搜索功能,为我们爬取数据提供了一个很好的切入点. 在查阅了一些资料,参考了一些爬虫的例子后,得到大体思路:构造URL,爬取网页,然后解析网页 具体往下看~ 登陆新浪微博,进入高级搜索,如图输入,之后发送请求会发现地址栏变为如下:    http://s.weibo.com/weibo/%25E4%25B8%25A

爬取百万数据的采集系统从零到整的过程

目录 需求 分析 设计 实现 框架 采集 遇到的问题 demo 数据 效果 数据 关注关注我的公众号啊 前言:记录下在上家公司负责过的一个采集系统从零到整的过程,包括需求,分析,设计,实现,遇到的问题及系统的成效,系统最主要功能就是可以通过对每个网站进行不同的采集规则配置对每个网站爬取数据,目前系统运行稳定,已爬取的数据量大概在600-700万之间(算上一些历史数据,应该也有到千万级了),每天采集的数据增量在一万左右,配置采集的网站1200多个,这个系统其实并不大,但是作为主要的coding人员

get_k_data 接口文档 全新的免费行情数据接口

get_k_data 接口文档 全新的免费行情数据接口 原创: Jimmy 挖地兔 2016-11-06 前言在tushareAPI里,曾经被用户喜欢和作为典范使用的API get_hist_data,经历了数据的一些些缺失和一丢丢错误之后,在用户们的齐声呼“换”之下,终于要变成tushare中的一个history.迎来的是一个集分钟数据.日周月数据,前后复权数据,揽括所有股票.指数和ETF的get_k_data.未来,还将加入期货期权等品种,所以,get_k_data或许将会成为未来一个“著名