13.2.1 访问世界银行的数据
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.Weblet 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=" + worldBankKeyfor 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®ion=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 下載數據的時候,就需要代碼有從非致命故障中恢復的能力。
總結
以上是生活随笔為你收集整理的13.2.1 访问世界银行的数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fir滤波 c语言,分享MSP430单片
- 下一篇: 万物皆可集成系列:低代码对接微信小程序