零基础学编程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 条评论
登录 后参与评论

相关文章

来自专栏风中追风

敏捷软件开发学习笔记

敏捷设计:敏捷设计是一个过程,不是一个事件,它是一个持续的应用原则、模式以及实践来改进软件的结构和可读性的过程,它致力于保持系统设计在任何实践都尽可能得简单,干...

3639
来自专栏程序员的诗和远方

20181125_ARTS_week22

这个解法来自 https://leetcode.com/problems/maximum-subarray/discuss/139218/Javascript-...

611
来自专栏ytkah

finecms在任意页面调用栏目名称和地址等

  finecms如何调用栏目名称和地址呢?在任意页面。我们有时需要在不同的页面调用某个栏目名,怎么调用比较快呢?ytkah整理了一些快速调用语句方便查找 栏目...

2964
来自专栏Python小屋

Python线性代数扩展库numpy.linalg中几个常用函数

本文内容节选自董付国老师2000页Python系列课件第17章“数据分析、科学计算、可视化、机器学习”(本章PPT共410页)。

1313
来自专栏Java架构

一个两年的程序员,面5家斩获点我达,网易offer的面试总结总结

毕业到现在也近两年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中...

961
来自专栏领域驱动设计DDD实战进阶

领域驱动设计之实体、值对象、领域服务

4499
来自专栏黑泽君的专栏

Java语言的发展史

  Java的名字来自于一种咖啡的品种名称,所以Java语言的Logo是一杯热气腾腾的咖啡。

941
来自专栏Crossin的编程教室

【Python 第41课】 用文件保存游戏(3)

你的小游戏现在已经可以保存成绩了,但只有一组成绩,不管谁来玩,都会算在里面。所以今天我还要加上一个更多的功能:存储多组成绩。玩家需要做的就是,在游戏开始前,输入...

2524
来自专栏落影的专栏

新鲜出炉的iOS面试题

为防止背题,大部分题目不设标准答案,重点考察面试者的基础知识和思维逻辑,答案的提示见后面。

1922
来自专栏Java架构

一个三年Java工程师的面试总结

15年毕业到现在也近3年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服)、网易、滴滴、点我达,最终收到点我达和网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在...

1233

扫码关注云+社区