*注:文章所述内容,仅用于测试,请不要应用于商业目标,由此带来的风险,请自行承担。

新浪的历史分时数据,经过了压缩和base64处理,解码代码位于sf_sdk.js中,这一行:

this.xh5_S_KLC_D = function(t) {

这个函数用于解码一天的分时数据,最简单的办法,就是把这个函数抠出来,保存到本地,然后通过requests拿到解码前数据,调用这个函数解码即可。

细节就不说了,需要安装PyExecJs库(pip install PyExecJs)

直接上测试代码(代码中引用的sf_sdk.js文件,见后面):

import requests,re
import execjsdef get_last_5days_data(code: str):'''获取指定股票最近5天的分时线数据(含当天)'''url = 'https://finance.sina.com.cn/realstock/company/%s/hisdata/klc_cm.js' % (code) # 指定日期对应的最近5天的分时数据 KLC_ML_szxxxxxx=prefix = 'KLC_ML_%s=' % coderes = requests.get(url)if res.status_code == 200:reg = re.compile(r'%s"(.+?)"' % prefix)data = reg.findall(res.text)with open('./sf_sdk.js', 'r') as f:js_file = f.read()ctx = execjs.compile(js_file)days_data = data[0].split(',')for i in range(len(days_data)):arr = ctx.call('decode', days_data[i])print(arr[0])def get_month_data(code: str, date: str):'''获取日期所在月份的所有分时数据(如果是当前月,不含当天的)'''year = date[0:4]month = date[5:7]url = 'http://finance.sina.com.cn/realstock/company/%s/hisdata/%s/%s.js?d=%s' % (code, year, month, date) # 指定日期所在月份的所有分时数据  MLC_szxxxxxx_2021_04=prefix = 'MLC_%s_%s_%s=' % (code, year, month)res = requests.get(url)if res.status_code == 200:reg = re.compile(r'%s"(.+?)"' % prefix)data = reg.findall(res.text)with open('./sf_sdk.js', 'r') as f:js_file = f.read()ctx = execjs.compile(js_file)days_data = data[0].split(',')for i in range(len(days_data)):arr = ctx.call('decode', days_data[i])print(arr[0])if __name__=='__main__':get_month_data('sz000001', '2021-11-07')get_last_5days_data('sz000001')

效果如下:

sf_sdk.js文件抠出的内容如下(就改了一个函数名)

function decode(t) {var e, i, n, r, a, o, s, l = (arguments,864e5), u = 7657, c = [], d = [], h = ~(3 << 30), f = 1 << 30, m = [0, 3, 5, 6, 9, 10, 12, 15, 17, 18, 20, 23, 24, 27, 29, 30], p = Math, g = function() {var l, u;for (l = 0; 64 > l; l++)d[l] = p.pow(2, l),26 > l && (c[l] = v(l + 65),c[l + 26] = v(l + 97),10 > l && (c[l + 52] = v(l + 48)));for (c.push("+", "/"),c = c.join(""),i = t.split(""),n = i.length,l = 0; n > l; l++)i[l] = c.indexOf(i[l]);return r = {},e = o = 0,a = {},u = w([12, 6]),s = 63 ^ u[1],{_1479: D,_136: _,_200: C,_139: R,_197: A,_3466: O}["_" + u[0]] || function() {return []}}, v = String.fromCharCode, b = function(t) {return t === {}._}, N = function() {var t, e;for (t = y(),e = 1; ; ) {if (!y())return e * (2 * t - 1);e++}}, y = function() {var t;return e >= n ? 0 : (t = i[e] & 1 << o,o++,o >= 6 && (o -= 6,e++),!!t)}, w = function(t, r, a) {var s, l, u, c, h;for (l = [],u = 0,r || (r = []),a || (a = []),s = 0; s < t.length; s++)if (c = t[s],u = 0,c) {if (e >= n)return l;if (t[s] <= 0)u = 0;else if (t[s] <= 30) {for (; h = 6 - o,h = c > h ? h : c,u |= (i[e] >> o & (1 << h) - 1) << t[s] - c,o += h,o >= 6 && (o -= 6,e++),c -= h,!(0 >= c); );r[s] && u >= d[t[s] - 1] && (u -= d[t[s]])} elseu = w([30, t[s] - 30], [0, r[s]]),a[s] || (u = u[0] + u[1] * d[30]);l[s] = u} elsel[s] = 0;return l}, x = function() {var t;return t = w([3])[0],1 == t ? (r.d = w([18], [1])[0],t = 0) : t || (t = w([6])[0]),t}, S = function(t) {var e, i, n;for (t > 1 && (e = 0),e = 0; t > e; e++)r.d++,n = r.d % 7,(3 == n || 4 == n) && (r.d += 5 - n);return i = new Date,i.setTime((u + r.d) * l),i}, k = function(t) {var e, i, n;for (n = r.wd || 62,e = 0; t > e; e++)dor.d++;while (!(n & 1 << (r.d % 7 + 10) % 7));return i = new Date,i.setTime((u + r.d) * l),i}, T = function(t) {var e, i, n;return t ? 0 > t ? (e = T(-t),[-e[0], -e[1]]) : (e = t % 3,i = (t - e) / 3,n = [i, i],e && n[e - 1]++,n) : [0, 0]}, P = function(t, e, i) {var n, r, a;for (r = "number" == typeof e ? T(e) : e,a = T(i),n = [a[0] - r[0], a[1] - r[1]],r = 1; n[0] < n[1]; )r *= 5,n[1]--;for (; n[1] < n[0]; )r *= 2,n[0]--;if (r > 1 && (t *= r),n = n[0],t = E(t),0 > n) {for (; t.length + n <= 0; )t = "0" + t;return n += t.length,r = t.substr(0, n) - 0,void 0 === i ? r + "." + t.substr(n) - 0 : (a = t.charAt(n) - 0,a > 5 ? r++ : 5 == a && (t.substr(n + 1) - 0 > 0 ? r++ : r += 1 & r),r)}for (; n > 0; n--)t += "0";return t - 0}, C = function() {var t, i, a, o, l;if (s >= 1)return [];for (r.d = w([18], [1])[0] - 1,a = w([3, 3, 30, 6]),r.p = a[0],r.ld = a[1],r.cd = a[2],r.c = a[3],r.m = p.pow(10, r.p),r.pc = r.cd / r.m,i = [],t = 0; o = {d: 1},y() && (a = w([3])[0],0 == a ? o.d = w([6])[0] : 1 == a ? (r.d = w([18])[0],o.d = 0) : o.d = a),l = {date: S(o.d)},y() && (r.ld += N()),a = w([3 * r.ld], [1]),r.cd += a[0],l.close = r.cd / r.m,i.push(l),!(e >= n) && (e != n - 1 || 63 & (r.c ^ t + 1)); t++);return i[0].prevclose = r.pc,i}, _ = function() {var t, i, a, o, l, u, c, d, h, f, m;if (s > 2)return [];for (c = [],h = {v: "volume",p: "price",a: "avg_price"},r.d = w([18], [1])[0] - 1,d = {date: S(1)},a = w(1 > s ? [3, 3, 4, 1, 1, 1, 5] : [4, 4, 4, 1, 1, 1, 3]),t = 0; 7 > t; t++)r[["la", "lp", "lv", "tv", "rv", "zv", "pp"][t]] = a[t];for (r.m = p.pow(10, r.pp),s >= 1 ? (a = w([3, 3]),r.c = a[0],a = a[1]) : (a = 5,r.c = 2),r.pc = w([6 * a])[0],d.pc = r.pc / r.m,r.cp = r.pc,r.da = 0,r.sa = r.sv = 0,t = 0; !(e >= n) && (e != n - 1 || 7 & (r.c ^ t)); t++) {for (l = {},o = {},f = r.tv ? y() : 1,i = 0; 3 > i; i++)if (m = ["v", "p", "a"][i],(f ? y() : 0) && (a = N(),r["l" + m] += a),u = "v" == m && r.rv ? y() : 1,a = w([3 * r["l" + m] + ("v" == m ? 7 * u : 0)], [!!i])[0] * (u ? 1 : 100),o[m] = a,"v" == m) {if (!(l[h[m]] = a) && (s > 1 || 241 > t) && (r.zv ? !y() : 1)) {o.p = 0;break}} else"a" == m && (r.da = (1 > s ? 0 : r.da) + o.a);r.sv += o.v,l[h.p] = (r.cp += o.p) / r.m,r.sa += o.v * r.cp,l[h.a] = b(o.a) ? t ? c[t - 1][h.a] : l[h.p] : r.sv ? ((p.floor((r.sa * (2e3 / r.m) + r.sv) / r.sv) >> 1) + r.da) / 1e3 : l[h.p] + r.da / 1e3,c.push(l)}return c[0].date = d.date,c[0].prevclose = d.pc,c}, D = function() {var t, e, i, n, a, o, l;if (s >= 1)return [];for (r.lv = 0,r.ld = 0,r.cd = 0,r.cv = [0, 0],r.p = w([6])[0],r.d = w([18], [1])[0] - 1,r.m = p.pow(10, r.p),a = w([3, 3]),r.md = a[0],r.mv = a[1],t = []; a = w([6]),a.length; ) {if (i = {c: a[0]},n = {},i.d = 1,32 & i.c)for (; ; ) {if (a = w([6])[0],63 == (16 | a)) {l = 16 & a ? "x" : "u",a = w([3, 3]),i[l + "_d"] = a[0] + r.md,i[l + "_v"] = a[1] + r.mv;break}if (32 & a) {o = 8 & a ? "d" : "v",l = 16 & a ? "x" : "u",i[l + "_" + o] = (7 & a) + r["m" + o];break}if (o = 15 & a,0 == o ? i.d = w([6])[0] : 1 == o ? (r.d = o = w([18])[0],i.d = 0) : i.d = o,!(16 & a))break}n.date = S(i.d);for (o in {v: 0,d: 0})b(i["x_" + o]) || (r["l" + o] = i["x_" + o]),b(i["u_" + o]) && (i["u_" + o] = r["l" + o]);for (i.l_l = [i.u_d, i.u_d, i.u_d, i.u_d, i.u_v],l = m[15 & i.c],1 & i.u_v && (l = 31 - l),16 & i.c && (i.l_l[4] += 2),e = 0; 5 > e; e++)l & 1 << 4 - e && i.l_l[e]++,i.l_l[e] *= 3;i.d_v = w(i.l_l, [1, 0, 0, 1, 1], [0, 0, 0, 0, 1]),o = r.cd + i.d_v[0],n.open = o / r.m,n.high = (o + i.d_v[1]) / r.m,n.low = (o - i.d_v[2]) / r.m,n.close = (o + i.d_v[3]) / r.m,a = i.d_v[4],"number" == typeof a && (a = [a, a >= 0 ? 0 : -1]),r.cd = o + i.d_v[3],l = r.cv[0] + a[0],r.cv = [l & h, r.cv[1] + a[1] + !!((r.cv[0] & h) + (a[0] & h) & f)],n.volume = (r.cv[0] & f - 1) + r.cv[1] * f,t.push(n)}return t}, R = function() {var t, e, i, n;if (s > 1)return [];for (r.l = 0,n = -1,r.d = w([18])[0] - 1,i = w([18])[0]; r.d < i; )e = S(1),0 >= n ? (y() && (r.l += N()),n = w([3 * r.l], [0])[0] + 1,t || (t = [e],n--)) : t.push(e),n--;return t}, A = function() {var t, i, a, o;if (s >= 1)return [];for (r.f = w([6])[0],r.c = w([6])[0],a = [],r.dv = [],r.dl = [],t = 0; t < r.f; t++)r.dv[t] = 0,r.dl[t] = 0;for (t = 0; !(e >= n) && (e != n - 1 || 7 & (r.c ^ t)); t++) {for (o = [],i = 0; i < r.f; i++)y() && (r.dl[i] += N()),r.dv[i] += w([3 * r.dl[i]], [1])[0],o[i] = r.dv[i];a.push(o)}return a}, O = function() {if (r = {b_avp: 1,b_ph: 0,b_phx: 0,b_sep: 0,p_p: 6,p_v: 0,p_a: 0,p_e: 0,p_t: 0,l_o: 3,l_h: 3,l_l: 3,l_c: 3,l_v: 5,l_a: 5,l_e: 3,l_t: 0,u_p: 0,u_v: 0,u_a: 0,wd: 62,d: 0},s > 0)return [];var t, i, a, o, l, u, c;for (t = []; ; ) {if (e >= n)return void 0;if (a = {d: 1,c: 0},y())if (y()) {if (y()) {for (a.c++,a.a = r.b_avp,y() && (r.b_avp ^= y(),r.b_ph ^= y(),r.b_phx ^= y(),a.s = r.b_sep,r.b_sep ^= y(),y() && (r.wd = w([7])[0]),a.s ^ r.b_sep && (a.s ? r.u_p = r.u_c : r.u_o = r.u_h = r.u_l = r.u_c = r.u_p)),u = 0; u < 3 + 2 * r.b_ph; u++)if (y() && (l = "pvaet".charAt(u),o = r["p_" + l],r["p_" + l] += N(),r["u_" + l] = P(r["u_" + l], o, r["p_" + l]) - 0,r.b_sep && !u))for (c = 0; 4 > c; c++)l = "ohlc".charAt(c),r["u_" + l] = P(r["u_" + l], o, r.p_p) - 0;!r.b_avp && a.a && (r.u_a = P(i && i.amount || 0, 0, r.p_a))}if (y())for (a.c++,u = 0; u < 7 + r.b_ph + r.b_phx; u++)y() && (6 == u ? a.d = x() : r["l_" + "ohlcva*et".charAt(u)] += N());if (y() && (a.c++,l = r.l_o + (y() && N()),o = w([3 * l], [1])[0],a.p = r.b_sep ? r.u_c + o : r.u_p += o),!a.c)break} elsey() ? y() ? y() ? a.d = x() : r.l_v += N() : r.b_ph && y() ? r["l_" + "et".charAt(r.b_phx && y())] += N() : r.l_a += N() : r["l_" + "ohlc".charAt(w([2])[0])] += N();for (u = 0; u < 6 + r.b_ph + r.b_phx; u++)c = "ohlcvaet".charAt(u),o = (r.b_sep ? 191 : 185) >> u & 1,a["v_" + c] = w([3 * r["l_" + c]], [o])[0];i = {date: k(a.d)},a.p && (i.prevclose = P(a.p, r.p_p)),r.b_sep ? (i.open = P(r.u_o += a.v_o, r.p_p),i.high = P(r.u_h += a.v_h, r.p_p),i.low = P(r.u_l += a.v_l, r.p_p),i.close = P(r.u_c += a.v_c, r.p_p)) : (a.o = r.u_p + a.v_o,i.open = P(a.o, r.p_p),i.high = P(a.o + a.v_h, r.p_p),i.low = P(a.o - a.v_l, r.p_p),i.close = P(r.u_p = a.o + a.v_c, r.p_p)),i.volume = P(r.u_v += a.v_v, r.p_v),r.b_avp ? (o = T(r.p_p),l = T(r.p_v),i.amount = P(P(Math.floor((r.b_sep ? (r.u_o + r.u_h + r.u_l + r.u_c) / 4 : a.o + (a.v_h - a.v_l + a.v_c) / 4) * r.u_v + .5), [o[0] + l[0], o[1] + l[1]], r.p_a) + a.v_a, r.p_a)) : (r.u_a += a.v_a,i.amount = P(r.u_a, r.p_a)),r.b_ph && (i.postVol = P(a.v_e, r.p_e),i.postAmt = P(Math.floor(i.postVol * i.close + (r.b_phx ? P(a.v_t, r.p_t) : 0) + .5), 0)),t.push(i)}return t}, E = function(t) {var e, i, n;if (t = (t || 0).toString(),n = [],i = t.toLowerCase().indexOf("e"),i > 0) {for (e = t.substr(i + 1) - 0; e >= 0; e--)n.push(Math.floor(e * Math.pow(10, -e) + .5) - 0);return n.join("")}return t};return g()()
}

用python获取新浪历史分时数据相关推荐

  1. python美国股票数据api_【美股量化00篇】Python获取新浪接口美股实时数据

    1.本篇以BABA(阿里巴巴)为例,在浏览器地址栏输入以下url,即可获取个股数据:阿里巴巴(BABA)实时数据​hq.sinajs.cn import requests url = 'http:// ...

  2. php 获取新浪股票行情数据,python 抓取新浪财经股票数据

    新浪并未提供API,但我们可以通过抓包来获取实时或历史行情数据. 实时行情 比如我们可以通过浏览器访问: ?== 来获取证券代码为的实时行情数据,可以看到内容为: ="华泰证券,,,,20. ...

  3. python爬取股票实时价格_【美股量化00篇】Python获取新浪接口美股实时数据

    1.本篇以BABA(阿里巴巴)为例,在浏览器地址栏输入以下url,即可获取个股数据: http://hq.sinajs.cn/list=gb_baba (股票代码必须为小写字母,结果如下图所示) 阿里 ...

  4. php 获取新浪股票行情数据,从新浪获取股票历史数据

    转自:http://blog.163.com/fluxray_sensor/blog/static/2965101520085213574929/ 这几天在网上找股票的历史数据想研究研究,最后找到一个 ...

  5. python股票数据分析_用Python抓取新浪的股票数据

    最近做数据分析,先是找到了Tushare这个免费开源的第三方财经包,但后来用了几天之后发现,它的日交易历史数据有时候有不准确的情况,查看源代码发现,这个包的数据源是凤凰财经,而对比凤凰网站其站点的数据 ...

  6. Python爬虫新浪新闻网【使用selenium获取JS加载的动态数据】

    1 requests爬取网站html文本 使用requests模块的get方法,直接爬取新浪网站的html文本:需要注意的是 res.encoding = "utf-8",而不是r ...

  7. python如何爬虫股票数据_如何抓取股票数据_用Python抓取新浪的股票数据

    python爬虫成长之路(一)抓取证券之星的股票数据 其中编译匹配模式findall方法使用这个匹配模式来匹配所需的信息并以列表的形式返回.正则表达式的语法非常多.下面我只列出使用的符号的含义.匹配除 ...

  8. JS获取新浪实时股票行情数据

    转自:http://blog.csdn.net/simon803/article/details/7784682 股票数据的获取目前有如下两种方法可以获取: 1. http/javascript接口取 ...

  9. 调用实现天气预报功能android,Android编程实现获取新浪天气预报数据的方法

    本文实例讲述了Android编程实现获取新浪天气预报数据的方法.分享给大家供大家参考,具体如下: 新浪天气预报地址: http://php.weather.sina.com.cn/xml.php?ci ...

最新文章

  1. 用java调用oracle存储过程总结二
  2. 获取分辨率函数是什么_深度学习应用“Zero Shot”超分辨率重构图像
  3. Ubuntu下搭建NFS,并在开发板挂载
  4. JAVA 基础算法汇总(持续更新)
  5. 物料编码在PDM与ERP集成中的应用研究
  6. 键盘指示灯亮着 按键全部失效了怎么办
  7. 大学物理计算机仿真实验报告,大学物理实验实验报告模板.doc
  8. java基础语法(三)--运算符、控制语句
  9. 你所谓的诗和远方,不过是虚荣感作祟
  10. 设置android应用闪屏图片_android 闪屏设计
  11. 计算机和数学专业哪个难,学计算机专业难吗 数学很差能学吗
  12. 构建TCP套接字(socket)的概念及具体步骤
  13. c# 调整图片分辨率
  14. 什么是java单例模式?
  15. 我来告诉你哪个银行的信用卡最好用!
  16. 数学——[0,+∞[ 的意思
  17. 提取视频关键帧和关键帧的时间点信息
  18. 闲谈杂记:理想中智能家居App是否都可以做成分享模式
  19. 记一次使用Cobar踩到的坑
  20. 推荐 5 个好玩的 ChatGPT 开源应用

热门文章

  1. 视频教程-SEO实战课程之站群优化-其他
  2. 前端 Chrome 插件推荐
  3. 谷歌的ie9.js ie8.js ie7.js 解决IE5、IE6、IE7、IE8与W3C标准的冲突
  4. 2022年团体程序设计天梯赛-总决赛
  5. 西部数据的硬盘加密毫无作用
  6. hfss和python_利用Python与HFSS联合仿真设计一个微带天线(附详细代码)
  7. 宁德时代、联合利华入选全球“灯塔工厂”;西门子医疗上海创新中心正式启用 | 美通社头条...
  8. MySQL规范及优化
  9. 如何保证按时上床睡觉?
  10. python弹钢琴_用mpython x玩转掌控板——音乐钢琴