零基础学编程021:获取股票实时行情数据

春节期间重写了“笑来投资演练程序1.0版”这个程序,可以每个月自动更新几支股票的行情数据。程序的功能不复杂,但是编程新手想实现它仍有相当的困难。为了短时间内完成主要功能,我使用了最熟悉的C#编程语言,先看实际完成的效果图。

像学英语一样,只有“”英语才能学好英语,而我们学编程,只有“”编程解决实际问题,才能学好编程。所以将来我准备用Python语言把股票小程序再实现一遍,即:用Python写一个程序,可以每月更新几支股票的行情数据

单单凭这一句话是无从下手的,得先做需求分析,关于需求分析的话题以后再说,我简要地画了一张草图,把想实现的功能和原型记录了下来。

这张图考虑了一些后续的功能,但我只挑选了最基础的功能作为1.0版本。面对这样一个程序,利用《怎样解题》中的策略,要将其逐步简化直至我们可以应付:

  • 简化:先做一个无界面的程序,可以每月更新几支股票的行情数据
  • 再简化:写一个无界面程序,获取几支股票的行情数据
  • 再简化:写一个无界面程序,获取一支股票的行情数据
  • 再简化:写一个无界面程序,获取“谷歌”股票的行情数据
  • 再简化:写一个无界面程序,获取“谷歌”股票的当日开盘价

到了这里,问题就已经相当简化了,我们可以准备动手编程了,再把今天的问题描述清楚。

问题描述

不要界面,获取“谷歌”股票的当日开盘价。

问题分析:

以前谈过“零基础学编程”都需要哪些基础?先要会用谷歌搜索,我首先用的关键词:python、股票实时行情。

浏览并对比几个搜索结果,发现“Python获取新浪财经股票数据”这篇文章的原理最简单,不过文章中附带的源代码有问题。

解决过程:

1)先找到谷歌的股票代码

这个过程略过了,到新浪网上可以找到,直接给出结果:“gb_goog”。

2)试验一下文章中的办法是否可行

在电脑的浏览器中输入“http://hq.sinajs.cn/list=gb_goog”,立刻得到一串行情数据:

var hq_str_gb_goog="谷歌,824.16,0.63,2017-02-17 21:25:47,5.18,819.93,824.40,818.98,841.95,663.28,1287626,1182462,565835289600,27.88,29.56,0.00,1.03,0.00,0.00,686560000,71.00,821.67,-0.30,-2.49,Feb 17 08:25AM EST,Feb 16 04:00PM EST,818.98,485.00";

网上文章的说明完全正确,只是对于美股来说,开盘价之后并不是收盘价。

3)写代码,做试验

import urllib.request as req

with req.urlopen('http://hq.sinajs.cn/list=gb_goog') as f :
    hq = f.read()
    print(hq)

运行的结果:

b'var hq_str_gb_goog="\xb9\xc8\xb8\xe8,824.16,0.63,2017-02-17 21:25:47,5.18,819.93,824.40,818.98,841.95,663.28,1287626,1182462,565835289600,27.88,29.56,0.00,1.03,0.00,0.00,686560000,71.00,821.67,-0.30,-2.49,Feb 17 08:25AM EST,Feb 16 04:00PM EST,818.98,485.00";\n'

结果出来了,可惜在字符串前面有一个字母b,尾部多了\n,中间还有一串怪字符。查阅Python的语法说明,原来这个b表示得到的是二进制字符串,中文不能正常显示。有经验的程序员一眼可以猜出,那个神秘的 \xb9\xc8\xb8\xe8 应该是GBK或GB2312编码的“谷歌”。涉及到字符编码的问题,又是一个大坑,绝对可以讲上7天7夜,这里先不细说了。

4)修改源代码,正确显示中文

查urllib库的帮助文档,里面有一个例子,可以把二进制串转换为指定的编码字符集,我们猜测是GBK编码,只需更换这一行代码:

    hq = f.read().decode('GBK')

这次运行后中文可以正确显示,也没有了首字母b!

5)获得开盘价

汉字“谷歌”之后的数值824.16就是开盘价,而收盘价是哪一个暂不清楚,留在以后再说。我们只需要把824.16正确取出来就基本完成任务了。曾经在《生成群文章目录》这里介绍过CSV,这一串字符也是逗号分隔的,但只有一行,用Python自带的字符串函数就行了。

split( ',' ) 函数可以把一个字符串从逗号的位置切开,生成一个列表,而v[1]就是824.16,正是我们想要的开盘价。再修改一下代码,任务完成。

    v = hq.split(',')
    print( v[1] )

小结:

  • 复杂的问题先分解
  • 学会使用搜索
  • 用到了urllib库
  • 以b字符开头的串是二进制串
  • 二进制的知识一定要学会,计算机只认二进制
  • 字符集转换是个复杂的坑,老程序员都被坑无数
  • split 函数可以切分出一个列表

--- END ---

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2017-02-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术

优秀的代码都是如何分层的?

说起应用分层,大部分人都会认为这个不是很简单嘛 就controller,service, mapper三层。看起来简单,很多人其实并没有把他们职责划分开,在很多...

842
来自专栏前端说吧

JS-过滤敏感词【RegExp】

3056
来自专栏程序员维他命

出一套 iOS 高级面试题

一千个读者眼中有一千个哈姆雷特,一千名 iOS 程序员心目中就有一千套 iOS 高级面试题。本文就是笔者认为可以用来面试高级 iOS 程序员的面试题。

1012
来自专栏阮一峰的网络日志

Javascript的10个设计缺陷

前几篇文章,我经常说Javascript的设计不够严谨,有很多失误。 今天的这一篇,前半部分就谈为什么会这样,后半部分将列举Javascript的10个设计缺陷...

3447
来自专栏微信公众号:Java团长

你的项目应该如何正确分层?

说起应用分层,大部分人都会认为这个不是很简单嘛 就controller,service, mapper三层。看起来简单,很多人其实并没有把他们职责划分开,在很多...

1053
来自专栏斑斓

代码诊所的第二次诊断

几年前,我有机会负责一个项目的咨询。团队很小,目标是对旧有系统的后端用Java改写,而团队的开发人员全为C程序员。我的工作职责是负责项目设计、开发,以及担任项目...

3455
来自专栏技术点滴

Lisp的本质(The Nature of Lisp)学习思考

Lisp的本质(The Nature of Lisp)学习思考 作者 Slava Akhmechet 译者 Alec Jang 出处: http://www....

1985
来自专栏京东技术

详解Android UI线程卡顿收集

作者:段云飞 京东前台产品研发部-资深Android工程师,主要负责手机京东Android端图片框架,性能优化,性能数据收集,对Android Framewor...

4166
来自专栏张善友的专栏

读《代码不朽:编写可维护软件的10大要则》C# 版

这本书特别针对没有接受过计算机科学或软件工程专业学习的软件开发人员,这类人员除了熟悉所用语言语法和语义之外,很少接受其他专业培训,对软件工程中的一些概念理解欠缺...

5920
来自专栏Java学习网

编程的智慧特点

  编程是一种创造性的工作,是一门艺术。精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的“智慧”,并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋...

3216

扫码关注云+社区