大家常用的新浪实时股票数据接口,即http://hq.sinajs.cn/list=code,最近发生了更新。直接用网页访问返回提示“Kinsoku jikou desu!”(日本语禁止访问,真有文化!)
经本人调查后发现,必须使用https访问,并且在请求头部添加Referer字段
因为之前使用@持有封基 老师的Excel模板,相关vbs的代码需要更新,添加请求头。但原来的XmlHttp对象无法伪造部分HTTP头信息(包括Referer),所以必须改为WinHttp对象才能访问
附上修改后的宏代码:
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "GET", URL, False
.setRequestHeader "Referer", "https://finance.sina.com.cn"
.Send
sTemp = .responseText
End With
经本人调查后发现,必须使用https访问,并且在请求头部添加Referer字段
因为之前使用@持有封基 老师的Excel模板,相关vbs的代码需要更新,添加请求头。但原来的XmlHttp对象无法伪造部分HTTP头信息(包括Referer),所以必须改为WinHttp对象才能访问
附上修改后的宏代码:
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "GET", URL, False
.setRequestHeader "Referer", "https://finance.sina.com.cn"
.Send
sTemp = .responseText
End With
1
赞同来自: heihei123123
@frank344
我用的Python,加了Referer以后再没出过问题。你们可能有短时间请求次数过多的问题。我看很多人分享的VB代码都是一个一个查询的,50个股票就要查询50次。实际上新浪股票API是可以一次查询50个股票的,比如:http://hq.sinajs.cn/list=sh510300,sz162411就可以返回两个结果。通过编程处理一下就好了。750个一次没问题
0
@kesen12
Sub 获取数据()
Call GetStockPrice(Sheet1)
End Sub
Sub GetStockPrice(ByVal sheet As Worksheet)
Dim rowCount As Integer
Dim URL As String
Dim sTemp As String
For nColumn = 66 To 90
code = sheet.Range(Chr(nColumn) & "1").Text
If Len(code) = 6 Then
URL = "https://hq.sinajs.cn/list=nf_" & code
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "GET", URL, False
.setRequestHeader "Referer", "https://finance.sina.com.cn"
.Send
sTemp = .responseText
End With
ss = InStr(sTemp, ",")
If ss > 1 Then
startindex = InStr(1, sTemp, """")
endindex = InStrRev(sTemp, """")
substr = Mid(sTemp, startindex + 1, endindex - 1)
valuearray = Split(substr, ",")
sheet.Range(Chr(nColumn) & "5").Value = valuearray(3) '当前价
End If
End If
Next nColumn
End Sub
大神大神。自己解决了,根据python代码反推了VBA中需要修改的部分,以下代码仅仅适用于股指期货:
我修改了if语句中的len>5,希望可以查询期货数据,然后真的可以查询了。
输入CF2209,可以显示名称、日期和实时价格(就是会有报错“下标越界”,但不影响)
可是输入IC2209、IF2209、IM2209都没有对应的数据。
翻看新浪期货网站的数据,网址就是这些代码IF2209没有错啊。
望大神不吝赐教!就是3个股指期货在新浪接口中的正确的代码是什么?谢谢
============...
Sub 获取数据()
Call GetStockPrice(Sheet1)
End Sub
Sub GetStockPrice(ByVal sheet As Worksheet)
Dim rowCount As Integer
Dim URL As String
Dim sTemp As String
For nColumn = 66 To 90
code = sheet.Range(Chr(nColumn) & "1").Text
If Len(code) = 6 Then
URL = "https://hq.sinajs.cn/list=nf_" & code
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "GET", URL, False
.setRequestHeader "Referer", "https://finance.sina.com.cn"
.Send
sTemp = .responseText
End With
ss = InStr(sTemp, ",")
If ss > 1 Then
startindex = InStr(1, sTemp, """")
endindex = InStrRev(sTemp, """")
substr = Mid(sTemp, startindex + 1, endindex - 1)
valuearray = Split(substr, ",")
sheet.Range(Chr(nColumn) & "5").Value = valuearray(3) '当前价
End If
End If
Next nColumn
End Sub
0
大神大神。
我修改了if语句中的len>5,希望可以查询期货数据,然后真的可以查询了。
输入CF2209,可以显示名称、日期和实时价格(就是会有报错“下标越界”,但不影响)
可是输入IC2209、IF2209、IM2209都没有对应的数据。
翻看新浪期货网站的数据,网址就是这些代码IF2209没有错啊。
望大神不吝赐教!就是3个股指期货在新浪接口中的正确的代码是什么?谢谢
==============
刚刚另外找了一个python的代码看看了数据的类型(编程白痴)
似乎不是代码的问题,是数据字段的顺序问题
我修改了if语句中的len>5,希望可以查询期货数据,然后真的可以查询了。
输入CF2209,可以显示名称、日期和实时价格(就是会有报错“下标越界”,但不影响)
可是输入IC2209、IF2209、IM2209都没有对应的数据。
翻看新浪期货网站的数据,网址就是这些代码IF2209没有错啊。
望大神不吝赐教!就是3个股指期货在新浪接口中的正确的代码是什么?谢谢
==============
刚刚另外找了一个python的代码看看了数据的类型(编程白痴)
似乎不是代码的问题,是数据字段的顺序问题
0
@talentzhuojun
新浪的访问第一次好像会redirect,你们这个库支持吗?
抓下包吧,网络交互走到什么地方了?有问题不就是这样一步步定位的嘛
大神们我用C,的curl整了两个月了没解决,求教。首先要确认你的curl库支持https吗?访问其他的https地址正常吗?
我得到的数据是:
var hq_sr_SZ000001="";
报错的信息有一句:
* schannel: failed to receive handshake,need more data
我的设置代码如下:
struct curl_slist *chunk = NULL;
chunk = curl_slist...
新浪的访问第一次好像会redirect,你们这个库支持吗?
抓下包吧,网络交互走到什么地方了?有问题不就是这样一步步定位的嘛
0
@talentzhuojun
request=urllib.request.Request(url,None,headers)
tempHTML = urllib.request.urlopen(request, timeout=40)
tempContent = tempHTML.read()
tempStr = tempContent.decode("gbk");
大神们我用C,的curl整了两个月了没解决,求教。headers = { 'Referer':"http://finance.sina.com.cn"}
我得到的数据是:
var hq_sr_SZ000001="";
报错的信息有一句:
* schannel: failed to receive handshake,need more data
我的设置代码如下:
struct curl_slist *chunk = NULL;
chunk = curl_slist...
request=urllib.request.Request(url,None,headers)
tempHTML = urllib.request.urlopen(request, timeout=40)
tempContent = tempHTML.read()
tempStr = tempContent.decode("gbk");
0
@apony
麻烦您给看看,我怎么就不能运行。
谢谢!
我把之前下载的样例文件简单修改了下,本机WIN11 Office2019测试正常,有需要的可以自取
数据获取.xlsm
链接: https://pan.baidu.com/s/1AEkQ1SOvQE0cLt3eG97kBA?pwd=z38s
提取码: z38s
麻烦您给看看,我怎么就不能运行。
谢谢!
0
大神们我用C,的curl整了两个月了没解决,求教。
我得到的数据是:
var hq_sr_SZ000001="";
报错的信息有一句:
* schannel: failed to receive handshake,need more data
我的设置代码如下:
struct curl_slist *chunk = NULL;
chunk = curl_slist_append(chunk, "Accept:");
chunk = curl_slist_append(chunk, "Another: yes");
chunk = curl_slist_append(chunk, "https://finance.sina.com.cn");
curl_easy_setopt(curl, CURLOPT_REFERER, "https://finance.sina.com.cn");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
curl_easy_setopt(curl, CURLOPT_URL, "https://hq.sinajs.cn/list=SZ000001");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
求指条明路。或能给我完整的python代码也行。
我得到的数据是:
var hq_sr_SZ000001="";
报错的信息有一句:
* schannel: failed to receive handshake,need more data
我的设置代码如下:
struct curl_slist *chunk = NULL;
chunk = curl_slist_append(chunk, "Accept:");
chunk = curl_slist_append(chunk, "Another: yes");
chunk = curl_slist_append(chunk, "https://finance.sina.com.cn");
curl_easy_setopt(curl, CURLOPT_REFERER, "https://finance.sina.com.cn");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
curl_easy_setopt(curl, CURLOPT_URL, "https://hq.sinajs.cn/list=SZ000001");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
求指条明路。或能给我完整的python代码也行。
0
@eugeneshi
我得到的数据是:
var hq_sr_SZ000001="";
报错的信息有一句:
* schannel: failed to receive handshake,need more data
我的设置代码如下:
struct curl_slist *chunk = NULL;
chunk = curl_slist_append(chunk, "Accept:");
chunk = curl_slist_append(chunk, "Another: yes");
chunk = curl_slist_append(chunk, "https://finance.sina.com.cn");
curl_easy_setopt(curl, CURLOPT_REFERER, "https://finance.sina.com.cn");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
curl_easy_setopt(curl, CURLOPT_URL, "https://hq.sinajs.cn/list=SZ000001");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
求指条明路。
这种算是最简单的,随便加个token估计很多人就搞不定了大神我用C,的curl整了两个月了没解决,求教。
我得到的数据是:
var hq_sr_SZ000001="";
报错的信息有一句:
* schannel: failed to receive handshake,need more data
我的设置代码如下:
struct curl_slist *chunk = NULL;
chunk = curl_slist_append(chunk, "Accept:");
chunk = curl_slist_append(chunk, "Another: yes");
chunk = curl_slist_append(chunk, "https://finance.sina.com.cn");
curl_easy_setopt(curl, CURLOPT_REFERER, "https://finance.sina.com.cn");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
curl_easy_setopt(curl, CURLOPT_URL, "https://hq.sinajs.cn/list=SZ000001");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
求指条明路。
0
@JSLULULU
request=urllib.request.Request(url,None,headers)
tempHTML = urllib.request.urlopen(request, timeout=40)
tempContent = tempHTML.read()
tempStr = tempContent.decode("gbk");
求教python怎么加Refererheaders = { 'Referer':"http://finance.sina.com.cn"}
request=urllib.request.Request(url,None,headers)
tempHTML = urllib.request.urlopen(request, timeout=40)
tempContent = tempHTML.read()
tempStr = tempContent.decode("gbk");
1
赞同来自: tdcq1988
@coobydean
数据获取.xlsm
链接: https://pan.baidu.com/s/1AEkQ1SOvQE0cLt3eG97kBA?pwd=z38s
提取码: z38s
麻烦提供excel文件我把之前下载的样例文件简单修改了下,本机WIN11 Office2019测试正常,有需要的可以自取
数据获取.xlsm
链接: https://pan.baidu.com/s/1AEkQ1SOvQE0cLt3eG97kBA?pwd=z38s
提取码: z38s
0
我用的Python,加了Referer以后再没出过问题。你们可能有短时间请求次数过多的问题。我看很多人分享的VB代码都是一个一个查询的,50个股票就要查询50次。实际上新浪股票API是可以一次查询50个股票的,比如:http://hq.sinajs.cn/list=sh510300,sz162411就可以返回两个结果。通过编程处理一下就好了。