23.1 Web服务

    在网络上,有大量的Web服务和应用,它们提供各式各样的服务。您会发现多数大型服务商都会提供(其服务的)应用程序接口(API),比如Yahoo! 、Google、eBay和Amazon等。过去API仅仅被用来访问使用这些服务的数据,但是今天的API已经不同,它们不但丰富而且功能齐全,而且您可以将这些Web服务整合到您自己的个人网站和网页中,这通常被称作“Mash-ups” [1]

    这是一些很有意思的功能,但是,暂时我们只简单的尝试一个很有用,同时提供时间也比较长的服务,即Yahoo!提供的股票报价服务。其网址是http://finance.yahoo.com.

    Yahoo!金融股票报价服务器[2]

    如果访问下面的网站查询某支股票的价格,就会在标了“DownloadData”的基本报价那里看到一个连接。这个连接允许你下载一个可以导入Microsoft Excel和Intuit Quicken的CSV格式文件。

    http://finance.yahoo.com/d/

    quotes.csv?s=GOOG&f=sl 1 dl ti c 1 ohgv&e=. esv

    如果浏览器的MIME设置正确的话,你的浏览器将启动Excel打开下载好的文件。这主要是因为连接中包含了e=xsv的设置。这样的设置将使server返回CSV格式的结果。

    如果我们使用urllib.urlopen()来得到报价,会得到一行CSV格式的返回结果:

    23.1 Web服务 - 图1

    您可以手工解析这个返回的字符串(去掉头尾的空白字符,根据逗号进行分割),或者也可以使用Python2. 3版本新加入的csv模块。这个模块自动完成字符串分割和去掉头尾空白字符的功能。使用csv的话,我们就可以其他的代码不变,把上面的那个for循环改为:

    23.1 Web服务 - 图2

    分析传递给server的f参数并看了Yahoo!的这个服务的在线帮助后,我们可以知道,符号slldltlclohgv对应着:订单号、最后的价格、日期、时间、变化量、开盘价、当日最高、当日最低和成交量。

    您可以通过访问Yahoo! Finance帮助页面获得更多的信息——只要搜索“download data”或“download spreadsheet format”就可以了。

    深入的分析这个API,我们可以得到更多的信息,如:上一次收盘价,52周内的最高和最低价等。总而言之,表23.1列出了返回数据的格式。

    每一段的名字按你想要的数据的顺序排列。只要把它们连接在一起整个作为参数f,加到请求URL中。

    23.1 Web服务 - 图3

    有些返回结果是用引号括起来的。解析代码要能正确地解析这些数据。观察上面手工解析返回字符串和用CSV模块解析返回字符串所得到的结果。如果某个值不存在报价,服务器会返回“N/A”。

    例如,如果我们给服务器的f字段为f=slldlclp2,我们会得到如下的字符串:

    23.1 Web服务 - 图4

    如果是不公开交易的股票,我们会得到如下的结果(注意,不少列都是双引号引起来的,包括N/A):

    23.1 Web服务 - 图5

    报价服务器也支持同时指定多支股票,如s=YHOO,GOOQEBAY,AMZN。返回的结果是每支股票信息占一行。要记住Yahoo! Finance帮助页面所说的:任何把Yahoo!显示的数据再次发布的行为都是严格禁止的。所以,你只能把这些信息用于私人用途。同时也要记住,所有你得到的数据,都是有一定延时的。用我们已有的知识,我们可以实现一个应用程序(例23.1),用于读取并显示一些我们关心的互连网公司的股票报价信息。

    例23.1 Yahoo! Finance股票报价示例(stock.py)

    这个脚本能从Yahoo!报价服务器下载并显示股票的价格。

    23.1 Web服务 - 图6

    23.1 Web服务 - 图7

    如果我们执行这个脚本,会得到如下的输出:

    23.1 Web服务 - 图8