13.2.1 访问世界银行的数据

来源:互联网 发布:mac apache 虚拟主机 编辑:程序博客网 时间:2024/06/05 23:50
 

13.2.1 访问世界银行的数据

 

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

 

提示

 

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

 

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

 

Listing 13.5 Building the request URL (F#)

 

open System.Web

let worldBankKey = "xxxxxxxxxx"
let worldBankUrl(functions, props) =
  seq { yield "http://open.worldbank.org"
        for item in functions do 
          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) }
  |> String.concat "&"

 

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

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

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

    在本章中,我们要创建一个 F# 脚本文件,这不是传统的应用程序,因此,下一步就是写一组 F# Interactive 的命令,可以立即执行,并看到我们刚写的函数是否正确工作。这种“测试请求(test request)"对于银行所用的数据格式也是非常有用,这样,我们就知道以后如何分析数据。

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

 

Listing 13.6 Testing the World Bank data service (F# Interactive)

 

> let url =
     worldBankUrl(["countries"],
                         ["region", "NA" ];;
val url : string =
http://open.worldbank.org/countries?per_page=100&
api_key=hq8byg8k7t2fxc6hp7jmbx26&region=NA"

> Async.RunSynchronously(downloadUrl(url));;
val it : string = "<?xml version=\"1.0\" encoding=\"utf-8\" (...)"

 

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

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

 

原创粉丝点击