13.2.1 访问世界银行的数据

我们在本章使用的数据源,是由世界银行提供的服务,它是为发展中国家提供资金和知识的国际组织。作为其工作的一部分,它需要识别哪种类型的支持最有效,确定需求在哪里,评估对发展中国家的经济,生活质量,环境是否产生了影响。世界银行有一组数据,称为世界发展指标(World Development Indicators),包含了许多国家的信息,而且数据在线可用。在本章,我们将使用有关环境信息,更具体的森林覆盖区域信息。由世界银行提供的数据可免费使用,但是,首先需要在它的网站上进行注册。

提示

要注册,先去 http://developer.worldbank.org,填写完表格,收到确认的电子邮件后,就可以返回网站,获取 API 密钥,用于将请求发送到世界银行服务。网站还提供了有关服务的文档和简明教程;你可以在那里看,但是,我们在这一章,也会解释所使用到的内容。网页上有一项重要的功能,是查询生成器,可以交互地运行、配置查询,显示的 URL 可以用于以编程方式请求数据。

世界银行使用简单的基于 HTTP 的服务公开数据,因此,我们可以使用早前创建的 downloadUrl 函数。如果你看过文档,或者体验过查询生成器一段时间,将很快学会请求 URL 的结构。地址总是指向服务器上的同一页面,所有额外属性在 URL 中以键-值对的形式提供。在清单 13.5 中,我们首先创建一个函数,来构造请求 URL,键-值对包含在 F# 列表中,这样,我们可以更方便地访问数据。

清单13.5 生成请求 URL (F#)

open System.Web

let worldBankKey = "xxxxxxxxxx"     <-- 在这里,提供世界银行的密钥
let worldBankUrl(functions, props) =
  seq { yield "http://open.worldbank.org"
        for item in functions do                    | [1]
          yield "/" + HttpUtility.UrlEncode(item:string)  |
        yield "?per_page=100"
        yield "&api_key=" + worldBankKey
        for key, value in props do
          yield "&" + key + "=" + HttpUtility.UrlEncode(value:string) }   [2]
  |> String.concat "&"

函数 worldBankUrl 包含一个序列表达式,生成字符串集合,然后,再将它们连接成一个 URL。

在序列表达式中,我们首先返回 URL 的基本部分。接下来,添加路径,指向由服务器提供所需的函数,例如,函数可能是“/keywords/Wood”,因此,我们可以得到描述函数名各部分的列表,再把所有这些用分隔符“/”连接起来[1]。指定函数以后,再添加 API 密钥和页面长度,这部分也是在这一章我们需要的所有请求所共享的。最后,处理由用户指定的额外属性,迭代由参数值 props 指定的所有键-值对,返回字符串“&键=值” [2]。

要确保 URL 格式正确,我们使用了 System.Web 命名空间下的 HttpUtility 类。如果编译文件,作为项目的一部分,需要添加对 System.Web 程序集引用,因此它不是默认引用。这个工具可以将任意字符串编码为可以包含在 URL 中的字符串。UrlEncode 方法有不同的重载,我们使用类型注解(type annotation)指定参数值 value 的类型是字符串。

在本章,我们将创建 F# 脚本文件,而不是传统的应用程序,因此,下一步就是写几个 F# 交互命令,可以立即执行,检查写的函数运行是否正确。这种“测试请求(test request)”对于银行所使用的数据格式,也是非常有用,因为,我们知道后面要解析数据。

由世界银行提供的统计数据既可用于个别国家,也可以按地区或收入分组,这些汇总统计更利于看到总体趋势。我们要做的第一件事,就是获取所有有关可用的分组信息,在网站上可以尝试使用查询生成器。首先,在 Country Calls 选项卡上选择 Countries(国家),并输入 API 密钥。要得到按国家分组的汇总列表,从Region(区域)列表中选择 Aggregates(汇总),然后,运行请求。清单 13.6 显示了使用 F# Interactive 运行相同的请求。

清单13.6 测试世界银行数据服务 (F# Interactive)

> let url =
     worldBankUrl(["countries"],     | [1]
                         ["region", "NA" ];;    | 用指定属性生成 URL
val url : string =
http://open.worldbank.org/countries?per_page=100&
api_key=hq8byg8k7t2fxc6hp7jmbx26&region=NA"

> Async.RunSynchronously(downloadUrl(url));;   [2] <-- 下载页面为字符串
val it : string = "<?xml version=\"1.0\" encoding=\"utf-8\" (...)"

我们首先使用刚刚实现的函数创建 URL[1],把 countries 作为我们想要调用的函数名,传递给它;另一个参数 region 指定我们想要列举的国家类型,NA 值表示我们对汇总的国家信息感兴趣。因为我们使用 F# Interactive,能立即看到组成的 URL,它包含了所有指定的参数,世界银行的密钥,以及为指定每个页面至多返回100 条记录的标志。后面,当我们需要获得更大数量的指标时,会讨论分页输出。

有了 URL 以后,我们就可以将其复制到浏览器,看看世界银行返回的数据。如果以编程方式下载页面,可以使用 downloadUrl 函数(来自清单 13.1)。因为使用任何网络操作,下载都可能会失败;如果我们手工运行请求,这并不重要,但是,当我们执行批量操作,并行从 URL 下载数据的时候,就需要代码有从非致命故障中恢复的能力。

时间: 2024-12-26 05:09:19

13.2.1 访问世界银行的数据的相关文章

JsRender实用教程(tag else使用、循环嵌套访问父级数据)

前言: 正在做angularJs的分页功能时,发现了JsRender这个插件,园子里的大神多,查到一个用JsRender实现的分页demo,地址是这个 http://www.cnblogs.com/sword-successful/p/4759027.html#3379766 查了一下相关的基本资料 下面是引自http://www.ziliao1.com/article/show/0c5ac83aeac0a1fc6af388817c52b6c0.html JsRender是一款基于jQuery的

学习ASP .NET MVC5官方教程总结(六)通过控制器访问模型的数据

学习ASP .NET MVC5官方教程总结(六)通过控制器访问模型的数据 在本章中,我们将新建一个MoviesController 控制器,并编写获取电影数据的代码,使用视图模板将数据展示在浏览器中. 在进行下一步之前,你需要先编译应用程序,否则在添加控制器的时候会出错. 在解决方法资源管理器的Controllers文件夹右键,选择"添加">"新建搭建基架项": 在"添加支架"对话框,选择 包含视图的MVC 5控制器(使用 En),然后单击

SQL Server 定时访问url激活数据同步

创建作业,执行以下命令 exec master..XP_cmdshell 'http://srm.rapoo.cn?op=sapintferace&i=1&t=1' 激活执行同步网步 以下内容来自网络,介绍如何启用  xp_cmdshell 扩展存储过程将命令 一.简介 xp_cmdshell 扩展存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出. 三.SQL Server 2005中的xp_cmdshell 由于存在安全隐患,所以在SQL Server

kettle中访问前一行数据

 kettle中访问前一行数据 在kettle中,当需要访问数据流前一行数据时,很多人都是用javascript步骤的特性:实际上没有必要,不是说javascript步骤不好,主要是性能低,同时也增加了复杂度,因为写代码让javascript步骤难以理解,最好是使用kettle标准步骤实现.我们的原则是代码最小化,过程轻松. (The Analytic Query Step)分析查询步骤 TheAnalytic Query 步骤可以查找数据流中的前面行或后面行,并且取值到当前行,很多场合是非

SQL应用与开发:(七)数据操作 &#183; 查 &#183; (三)使用子查询访问和修改数据

3.使用子查询访问和修改数据 子查询和连接查询一样提供了使用单个查询访问多个表中的数据的方法.子查询在其他结果的基础上提供一种有效地方式来表示WHERE子句的条件.子查询是一个SELECT语句,它定义在SELECT.INSERT.UPDATE或DELECT语句或者另一个子查询中.子查询的SELECT语句可与外部查询指向不同的表. 嵌套的子查询或嵌套的SELECT语句是指包含一个或多个子查询的SELECT语句.子查询可嵌套在外部的SELECT.INSERT.UPDATE或DELECT语句的WHER

server 2008访问Server 2003数据慢

打开2003服务器,右击“我的电脑”选择“管理”, 点击左侧服务,然后在右侧启动HTTP SSL服务就可以了! 开启以后,访问速度立马就正常了! server 2008访问Server 2003数据慢

数据访问模式:数据并发控制(Data Concurrency Control)

1.数据并发控制(Data Concurrency Control)简介 数据并发控制(Data Concurrency Control)是用来处理在同一时刻对被持久化的业务对象进行多次修改的系统.当多个用户修改业务对象的状态并试图并发地将其持久化到数据库时,需要一种机制来确保一个用户不会对另一个并发用户的事务状态造成负面影响. 有两种形式的并发控制:乐观和悲观.乐观并发控制假设当多个用户对业务对象的状态同时进行修改时不会造成任何问题,也称为最晚修改生效(last change wins).对于

13.4.2.2 格式化世界银行的数据

我们声明的 readValues 函数,从 XML 文档中读取值,最后一个参数是解析函数,用于将每个数据点转换到适当类型的值.我们下载的数组包含了以平方公里计的三个数据集的面积,和森林覆盖率的三个数据集.清单 13.16 显示了把原始文档转换成数据结构,从中可以方便提取重要信息. 清单 13.16 把原始数据转换成类型化的数据结构 (F#) let areas = Seq.concat(data.[0..2]) [1] |> readValues (fun a -> float(a) * 1.

EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题

小故事 在开始讲这篇文章之前,我们来说一个小故事,纯素虚构(真实的存钱逻辑并非如此) 小刘发工资后,赶忙拿着现金去银行,准备把钱存起来,而与此同时,小刘的老婆刘嫂知道小刘的品性,知道他发工资的日子,也知道他喜欢一发工资就去银行存起来,担心小刘卡里存的钱太多拿去"大宝剑",于是,也去了银行,想趁着小刘把钱存进去后就把钱给取出来,省的夜长梦多. 小刘与刘嫂取得是两家不同的银行的ATM,所以两人没有碰面. 小刘插入银行卡存钱之前查询了自己的余额,ATM这样显示的: 与次同时,刘嫂也通过卡号和