13.2.1 访问世界银行的数据
13.2.1 訪問世界銀行的數(shù)據(jù)
我們在本章使用的數(shù)據(jù)源,是由世界銀行提供的服務(wù),它是為發(fā)展中國家提供資金和知識的國際組織。作為其工作的一部分,它需要識別哪種類型的支持最有效,確定需求在哪里,評估對發(fā)展中國家的經(jīng)濟(jì),生活質(zhì)量,環(huán)境是否產(chǎn)生了影響。世界銀行有一組數(shù)據(jù),稱為世界發(fā)展指標(biāo)(World Development Indicators),包含了許多國家的信息,而且數(shù)據(jù)在線可用。在本章,我們將使用有關(guān)環(huán)境信息,更具體的森林覆蓋區(qū)域信息。由世界銀行提供的數(shù)據(jù)可免費(fèi)使用,但是,首先需要在它的網(wǎng)站上進(jìn)行注冊。
提示
要注冊,先去 http://developer.worldbank.org,填寫完表格,收到確認(rèn)的電子郵件后,就可以返回網(wǎng)站,獲取 API 密鑰,用于將請求發(fā)送到世界銀行服務(wù)。網(wǎng)站還提供了有關(guān)服務(wù)的文檔和簡明教程;你可以在那里看,但是,我們在這一章,也會解釋所使用到的內(nèi)容。網(wǎng)頁上有一項(xiàng)重要的功能,是查詢生成器,可以交互地運(yùn)行、配置查詢,顯示的 URL 可以用于以編程方式請求數(shù)據(jù)。
世界銀行使用簡單的基于 HTTP 的服務(wù)公開數(shù)據(jù),因此,我們可以使用早前創(chuàng)建的 downloadUrl 函數(shù)。如果你看過文檔,或者體驗(yàn)過查詢生成器一段時間,將很快學(xué)會請求 URL 的結(jié)構(gòu)。地址總是指向服務(wù)器上的同一頁面,所有額外屬性在 URL 中以鍵-值對的形式提供。在清單 13.5 中,我們首先創(chuàng)建一個函數(shù),來構(gòu)造請求 URL,鍵-值對包含在 F# 列表中,這樣,我們可以更方便地訪問數(shù)據(jù)。
清單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 "&"函數(shù) worldBankUrl 包含一個序列表達(dá)式,生成字符串集合,然后,再將它們連接成一個 URL。
在序列表達(dá)式中,我們首先返回 URL 的基本部分。接下來,添加路徑,指向由服務(wù)器提供所需的函數(shù),例如,函數(shù)可能是“/keywords/Wood”,因此,我們可以得到描述函數(shù)名各部分的列表,再把所有這些用分隔符“/”連接起來[1]。指定函數(shù)以后,再添加 API 密鑰和頁面長度,這部分也是在這一章我們需要的所有請求所共享的。最后,處理由用戶指定的額外屬性,迭代由參數(shù)值 props 指定的所有鍵-值對,返回字符串“&鍵=值” [2]。
要確保 URL 格式正確,我們使用了 System.Web 命名空間下的 HttpUtility 類。如果編譯文件,作為項(xiàng)目的一部分,需要添加對 System.Web 程序集引用,因此它不是默認(rèn)引用。這個工具可以將任意字符串編碼為可以包含在 URL 中的字符串。UrlEncode 方法有不同的重載,我們使用類型注解(type annotation)指定參數(shù)值 value 的類型是字符串。
在本章,我們將創(chuàng)建 F# 腳本文件,而不是傳統(tǒng)的應(yīng)用程序,因此,下一步就是寫幾個 F# 交互命令,可以立即執(zhí)行,檢查寫的函數(shù)運(yùn)行是否正確。這種“測試請求(test request)”對于銀行所使用的數(shù)據(jù)格式,也是非常有用,因?yàn)?#xff0c;我們知道后面要解析數(shù)據(jù)。
由世界銀行提供的統(tǒng)計數(shù)據(jù)既可用于個別國家,也可以按地區(qū)或收入分組,這些匯總統(tǒng)計更利于看到總體趨勢。我們要做的第一件事,就是獲取所有有關(guān)可用的分組信息,在網(wǎng)站上可以嘗試使用查詢生成器。首先,在 Country Calls 選項(xiàng)卡上選擇 Countries(國家),并輸入 API 密鑰。要得到按國家分組的匯總列表,從Region(區(qū)域)列表中選擇 Aggregates(匯總),然后,運(yùn)行請求。清單 13.6 顯示了使用 F# Interactive 運(yùn)行相同的請求。
清單13.6 測試世界銀行數(shù)據(jù)服務(wù) (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\" (...)"我們首先使用剛剛實(shí)現(xiàn)的函數(shù)創(chuàng)建 URL[1],把 countries 作為我們想要調(diào)用的函數(shù)名,傳遞給它;另一個參數(shù) region 指定我們想要列舉的國家類型,NA 值表示我們對匯總的國家信息感興趣。因?yàn)槲覀兪褂?F# Interactive,能立即看到組成的 URL,它包含了所有指定的參數(shù),世界銀行的密鑰,以及為指定每個頁面至多返回100 條記錄的標(biāo)志。后面,當(dāng)我們需要獲得更大數(shù)量的指標(biāo)時,會討論分頁輸出。
有了 URL 以后,我們就可以將其復(fù)制到瀏覽器,看看世界銀行返回的數(shù)據(jù)。如果以編程方式下載頁面,可以使用 downloadUrl 函數(shù)(來自清單 13.1)。因?yàn)槭褂萌魏尉W(wǎng)絡(luò)操作,下載都可能會失敗;如果我們手工運(yùn)行請求,這并不重要,但是,當(dāng)我們執(zhí)行批量操作,并行從 URL 下載數(shù)據(jù)的時候,就需要代碼有從非致命故障中恢復(fù)的能力。
總結(jié)
以上是生活随笔為你收集整理的13.2.1 访问世界银行的数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fir滤波 c语言,分享MSP430单片
- 下一篇: 万物皆可集成系列:低代码对接微信小程序