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

相关文章

来自专栏张善友的专栏

Using sqlite with .NET

The other day I found that there is a .NET wrapper for sqlite. sqlite is a very ...

2258
来自专栏码匠的流水账

聊聊EurekaRibbonClientConfiguration

spring-cloud-netflix-eureka-client-2.0.0.RELEASE-sources.jar!/org/springframewor...

1161
来自专栏菩提树下的杨过

SqlTransaction事务使用示例

using System; using System.Data; using System.Data.SqlClient; using System.Co...

1838
来自专栏xingoo, 一个梦想做发明家的程序员

windows程序设计-第四章 system1.c

/*---------------------------------------------------- SYSMETS1.C -- System M...

23310
来自专栏跟着阿笨一起玩NET

C#巧用Excel模版变成把Table打印出来

转载:http://blog.csdn.net/gwblue/article/details/38865525

1152
来自专栏闻道于事

商城项目整理(三)JDBC增删改查

商品表的增加,修改,删除,订单表的增加,确认,用户表的查看,日志表的增加,查看 商品表建表语句: 1 create table TEST.GOODS_TABL...

5435
来自专栏菩提树下的杨过

MSDN官方的ASP.Net异步页面的经典示例代码

示例1.演示异步获取一个网址的内容,处理后显示在OutPut这一Label上 using System; using System.Web; using S...

1985
来自专栏玩转JavaEE

RestTemplate的逆袭之路,从发送请求到负载均衡

上篇文章我们详细的介绍了RestTemplate发送请求的问题,熟悉Spring的小伙伴可能会发现:RestTemplate不就是Spring提供的一个发送请求...

1.1K4
来自专栏跟着阿笨一起玩NET

C# 通过HttpWebRequest在后台对WebService进行调用

http://www.cnblogs.com/macroxu-1982/archive/2009/12/23/1630415.html

2732
来自专栏葡萄城控件技术团队

Table-values parameter(TVP)系列之二: 利用DataTable将其作为参数传给SP

一,回顾         上一部分讲述了“在T-SQL中创建和使用TVP”,通过T-SQL建立如下的对象:         1)Tables ...

2069

扫码关注云+社区