- 數據準備和特征工程:數據工程師必知必會技能
- 齊偉
- 1287字
- 2020-06-05 17:00:54
1.4 來自API的數據
API(Application Programming Interface,應用程序接口)是軟件程序或者網絡服務與外界進行交互的接口,通過它可以得到程序或者網站所提供的一些數據。對API的更詳細介紹,可以參閱:https://en.wikipedia.org/wiki/Application_programming_interface。
port可譯為“端口”“接口”,通常用于硬件;interface可譯為“界面”“接口”,一般指抽象化的中介物。
基礎知識
網站提供API讓開發者調用有關數據,已經是比較普遍的商業現象。此處列舉簡單的示例,讓讀者初步了解相關技能。

①所訪問的是github.com網站提供的API,通過它獲得用戶名為qiwsir的用戶在github.com上有關信息——qiwsir是本書作者在github.com網站的用戶名。
從Out[1]的結果可知,①的訪問請求成功了。

在1.3節演示爬蟲技術的時候,曾經使用返回對象的text屬性,得到了返回內容的字符串,即所得頁面的源碼。在In[2]中也可以通過text屬性得到一個字符串,不過,對于API而言,一般得到的是JSON格式的數據,In[2]調用了返回對象的json方法,Out[2]顯示的為其結果。
對于JSON格式的數據,可以認為是半格式化的數據,為了在數據分析和機器學習中使用,通常要從中選出所需要的部分,并保存為結構化數據,比如保存到CSV文件。
JSON(JavaScript Object Notation,JavaScript對象表示法)是輕量級的文本數據交換格式,獨立于語言。JSON解析器和JSON庫支持許多不同的編程語言。

②得到了JSON格式的數據,然后用③及其后面的語句從中抽取出所需要的部分,并將它們定義為DataFrame類型的數據(如④)——這是結構化的數據。
以上示例只是從通過API中得到了一個用戶(qiwsir)的有關信息,如果有多個用戶,則可以通過循環語句向github.com提交多次請求——修改In[1]的①中請求地址(https://api.github.com/users/{user}的{user}值為用戶名)。
項目案例
1.項目描述
本地新聞API:https://news.baidu.com/widget?id=LocalNews&ajax=json。
利用此API,完成下述操作:
●得到本地新聞。
●將新聞標題、URL保存到CSV文檔中。
URL包括以下各項。
1.協議:http:,代表網頁使用的是HTTP協議。“https:”后面的“//”為分隔符。
2.域名:“news.baidu.com”。
3.端口:端口不是一個URL必需的部分,如果省略端口部分,則采用默認端口80。
4.虛擬目錄:指域名后面的“/”,widget為目錄名稱。
5.參數:以“?”表示,id為參數,值為LocalNews。如果有多個參數,則用“&”作為分隔符。
2.實現過程

執行In[4]代碼,得到了變量local_news所引用的JSON對象。建議讀者執行此程序,并顯示local_news的完整內容,通過分析其結構,以確定如何得到新聞標題和URL。

In[5]的⑤就是在對In[4]所得的JSON數據進行分析之后,得到所有的新聞列表,然后用循環語句取出每條新聞,并將其中的部分內容追加到一個空DataFrame中(如⑥所示)。
很多網站都向開發者提供了豐富的API,在網站之外的應用中調用本網站的有關數據。通常,網站都會提供比較完整的API相關文檔,開發者應首先認真閱讀文檔,根據有關規定向網站提交請求后才能得到正確的回復信息。
動手練習
1.利用下面的API,查詢任意指定日期對應的農歷和相關其他信息。
使用requests的get請求此API,要增加headers參數。
API地址為https://www.sojson.com/open/api/lunar/json.shtml?date={data},data的格式為“年-月-日”,例如https://www.sojson.com/open/api/lunar/json.shtml?date=2019-07-28。
2.創建一個Python列表,其中的元素為國內部分城市名稱(數量自定)。然后在網上找一個提供城市經緯度的API,獲得每個城市的經緯度數值,并保存到CSV文檔中。
擴展探究
大型網站一般都有“開放平臺”,其中會包含多方面的API,以便開發者使用。請讀者根據自己的興趣,選擇一個網站的“開放平臺”,并深入研究其中的API使用方法,并獲得某些有價值的數據。