13.2.1 访问世界银行的数据

728 篇文章 1 订阅
349 篇文章 0 订阅

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 = " hq8byg8k7t2fxc6hp7jmbx26"       <-- 在这里,提供世界银行的密钥
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# 运行相同的请求。

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

> 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#,能立即看到用指定参数生成的 URL,包括世界银行的密钥,以及为指定每个页面至多返回100 条记录的标志。后面,当我们需要获得有大量数据的指标时,会讨论分页输出。
有了 URL 以后,就可以复制到浏览器,得到世界银行返回的数据。如果以编程方式下载页面,可以使用 downloadUrl 函数(见清单 13.1)。使用任何网络操作,下载都可能会失败;如果手工运行请求,这一点并不重要,但是,当我们执行批量操作,并行从 URL 下载数据时,就需要代码有从非致命故障中恢复的能力了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值