python數(shù)據(jù)采集4-使用API
文章目錄
python數(shù)據(jù)采集4-使用API
API概述
API通用規(guī)則
方法
驗證
服務器響應
解析JSON數(shù)據(jù)
python數(shù)據(jù)采集4-使用API
API概述
API 就是
應用編程接口(Application Programming Interface,API)
它們?yōu)椴煌膽?/p>
用提供了方便友好的接口。不同的開發(fā)者用不同的架構,甚至不同的語言編寫軟件都沒問
題——因為 API 設計的目的就是要成為一種通用語言,讓不同的軟件進行信息共享。
瀏覽器輸入下面
http://freegeoip.net/json/50.78.253.58
1
2
3
返回下面的數(shù)據(jù)
{ "ip": "50.78.253.58", "country_code": "US", "country_name": "United States", "region_code": "MA", "region_name": "Massachusetts", "city": "Boston", "zip_code": "02116", "time_zone": "America/New_York", "latitude": 42.3496, "longitude": -71.0746, "metro_code": 506 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
你可能會想,這不就是在瀏覽器窗口輸入一個網址,按回車后獲取的(只是 JSON 格式)
信息嗎?究竟 API 和普通的網址訪問有什么區(qū)別呢?如果不考慮 API 高大上的名稱,其實
兩者沒啥區(qū)別。API 可以通過 HTTP 協(xié)議下載文件,和 URL 訪問網站獲取數(shù)據(jù)的協(xié)議一
樣,它幾乎可以實現(xiàn)所有在網上干的事情。API 之所以叫 API 而不是叫網站的原因,其實
是首先 API 請求使用非常嚴謹?shù)恼Z法,其次 API 用 JSON 或 XML 格式表示數(shù)據(jù),而不是
HTML 格式
API通用規(guī)則
和大多數(shù)網絡數(shù)據(jù)采集的方式不同,API 用一套非常標準的規(guī)則生成數(shù)據(jù),而且生成的數(shù)
據(jù)也是按照非常標準的方式組織的。因為規(guī)則很標準,所以一些簡單、基本的規(guī)則很容易
學,可以幫你快速地掌握任意 API 的用法。
不過并非所有 API 都很簡單,有些 API 的規(guī)則比較復雜,因此第一次使用一個 API 時,建
議閱讀文檔,無論你對以前用過的 API 是多么熟悉。
方法
利用 HTTP 從網絡服務獲取信息有四種方式:
GET
POST
PUT
DELETE
GET就是你在瀏覽器中輸入網址瀏覽網站所做的事情。當你訪問 http://freegeoip.net/
json/50.78.253.58 時,就會使用 GET 方法。可以想象成 GET 在說:“喂,網絡服務器,請按
照這個網址給我信息。”
POST基本就是當你填寫表單或提交信息到網絡服務器的后端程序時所做的事情。每次當你
登錄網站的時候,就是通過用戶名和(有可能加密的)密碼發(fā)起一個 POST 請求。如果你用
API 發(fā)起一個 POST 請求,相當于說“請把信息保存到你的數(shù)據(jù)庫里”。
PUT在網站交互過程中不常用,但是在 API 里面有時會用到。 PUT 請求用來更新一個對象
或信息。例如,API 可能會要求用 POST 請求創(chuàng)建新用戶,但是如果你要更新老用戶的郵箱
地址,就要用 PUT 請求了。
DELETE用于刪除一個對象。例如,如果我們向 http://myapi.com/user/23 發(fā)出一個 DELETE 請
求,就會刪除 ID 號是 23 的用戶。 DELETE 方法在公共 API 里面不常用,它們主要用于創(chuàng)建
信息,不能隨便讓一個用戶去刪掉數(shù)據(jù)庫的信息。但是,和 PUT 方法一樣, DELETE 方法也
值得了解一下。
雖然在 HTTP 規(guī)范里還有一些信息處理方式,但是這四種基本是你使用 API 過程中可能遇
到的全部。
其實,很多 API 在更新信息的時候都是用 POST 請求代替 PUT 請求。究竟是創(chuàng)建一個新實體還是更新
一個舊實體,通常要看 API 請求本身是如何構建的。不過,掌握兩者的差異還是有好處的,用 API
的時候你經常會遇到 PUT 請求。
驗證
有些 API 要求客戶驗證是為了計算 API 調用的費用,或者是提供了包月的服務。有些驗證
是為了“限制”用戶使用 API(限制每秒鐘、每小時或每天 API 調用的次數(shù)),或者是限
制一部分用戶對某種信息或某類 API 的訪問。還有一些 API 可能不要求驗證,但是可能會為了市場營銷而跟蹤用戶的使用行為。
例如,調用 The Echo Nest 音樂平臺的 API 獲取槍與玫瑰樂隊(Guns N’Roses)的歌曲:
http://developer.echonest.com/api/v4/artist/songs?api_key=<你的api_key> %20&name=guns%20n%27%20roses&format=json&start=0&results=100
1
2
這個鏈接向服務器提供的 api_key 是我注冊之后得到的,服務器會識別出這個鏈接發(fā)起的
是 Ryan Mitchell(我)的請求,然后向請求者提供 JSON 格式的數(shù)據(jù)。
令牌除了在 URL 鏈接中傳遞,還會通過請求頭里的 cookie 把用戶信息傳遞給服務器。我
們將在本章后面和第 12 章更加詳細地介紹請求頭的內容,這里僅做簡單的演示,請求頭
可以用前幾章使用的 urllib 包進行傳遞。
token = "
1
2
3
4
5
6
服務器響應
API 有一個重要的特征是它們會反饋格式友好
的數(shù)據(jù)。大多數(shù)反饋的數(shù)據(jù)格式都是 XML 和 JSON。
這幾年,JSON 比 XML 更受歡迎,主要有兩個原因。首先,JSON 文件比完整的 XML 格
式小。比如下面的 XML 數(shù)據(jù)用了 98 個字符:
1
2
3
同樣的 JSON 格式數(shù)據(jù):
{"user":{"firstname":"Ryan","lastname":"Mitchell","username":"Kludgist"}}
1
2
3
4
5
只要用 73 個字符,比表述同樣內容的 XML 文件要小 36%。
JSON 格式比 XML 更受歡迎的另一個原因是網絡技術的改變。過去,服務器端用 PHP
和 .NET 這些程序作為 API 的接收端。現(xiàn)在,服務器端也會用一些 javaScript 框架作為 API
的發(fā)送和接收端,像 Angular 或 Backbone 等。雖然服務器端的技術無法預測它們即將收到
的數(shù)據(jù)格式,但是像 Backbone 之類的 javaScript 庫處理 JSON 比處理 XML 要更簡單。
雖然大多數(shù) API 都支持 XML 數(shù)據(jù)格式,但在本書中我們還是用 JSON 格式。當然,如果
你還沒有把兩種格式都掌握,那么現(xiàn)在熟悉它們是個好時機——短期內它們都不會消失。
解析JSON數(shù)據(jù)
我用過 freegeoip.net 網站 IP 查詢的例子,可以把 IP 地址解析轉換成地
理位置:
http://freegeoip.net/json/50.78.253.58
1
2
我可以獲取這個請求的反饋數(shù)據(jù),然后用 Python 的 JSON 解析函數(shù)來解碼
# -*- coding: utf-8 -*- """ Created on Mon Jan 29 22:37:29 2018 @author: szm """ import json from urllib.request import urlopen def getCountry(ipAddress): response = urlopen("http://freegeoip.net/json/"+ipAddress).read().decode('utf-8') responseJson = json.loads(response) return responseJson.get("country_code") print(getCountry("50.78.253.58"))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
返回結果如下
US
1
2
3
這里用的 JSON 解析庫是 Python 標準庫的一部分。只需要在代碼開頭寫上 import json ,
你就可以使用它了!不同于那些需要先把 JSON 解析成一種 JSON 對象或 JSON 節(jié)點的語
言,Python 使用了一種更加靈活的方式,把 JSON 轉換成字典,JSON 數(shù)組轉換成列表,JSON 字符串轉換成 Python 字符串。通過這種方式,就可以讓 JSON 的獲取和操作變得非
常簡單。
下面的例子演示了如何使用 Python 的 JSON 解析庫,處理 JSON 字符串中可能出現(xiàn)的不同
數(shù)據(jù)類型:
# -*- coding: utf-8 -*- """ Created on Mon Jan 29 22:37:29 2018 @author: szm """ import json jsonString = '{"arrayOfNums":[{"number":0},{"number":1},{"number":2}],"arrayOfFruits":[{"fruit":"apple"},{"fruit":"banana"},{"fruit":"pear"}]}' jsonObj = json.loads(jsonString) print(jsonObj.get("arrayOfNums")) print(jsonObj.get("arrayOfNums")[1]) print(jsonObj.get("arrayOfNums")[1].get("number")+jsonObj.get("arrayOfNums")[2].get("number")) print(jsonObj.get("arrayOfFruits")[2].get("fruit"))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
返回結果
[{'number': 0}, {'number': 1}, {'number': 2}] {'number': 1} 3 pear
1
2
3
4
5
6
第一行是一個組詞典構成的列表對象,第二行是一個詞典對象,第三行是一個整數(shù)(第一
行詞典列表里整數(shù)的和),第四行是一個字符串。
API Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。