天天看點

爬蟲系列:使用 API

應用程式設計接口(Application Programming Interface, API)的用處:它為不同的應用提供了友善友好的接口。不同的開發者用不同的架構,甚至是不同的語言編寫軟體都沒有問題——因為 API 設計的目的就是要成為一種通信語言,讓不同的軟體進行資訊共享。

盡管目前不同的軟體應用都有各自不同的 API,但“API”經常被看成“網絡應用 API”,一般情況下,程式員可以用 HTTP 協定向 API 發起請求以擷取某種資訊,API 會用 XML(eXtensible Markup Language,可擴充标記語言)或 JSON (Javascript Object Notation,Javascript 對象表示)格式傳回伺服器響應的資訊。盡管大多數 API 仍然在使用 XML,但是 JSON 正在快速成為資料編碼格式的主流選擇。

雖然這種即開即用的接口擷取預先打包好的資訊,看起來好像和爬蟲沒有什麼關系,但是這種看法隻是對了一半。雖然大多數人通常不會把使用 API 看成網絡資料采集,但是實際上這兩者使用的許多技術(都是發送 HTTP 請求)和産生的結果(都是擷取資訊)差不太多,兩者經常是相輔相成的關系。

例如,你可能會把網絡爬蟲和 API 擷取的資訊組合起來,因為這樣的資訊可能更有意義。

API 概述

雖然 API 并非随處可見,但是你可以通過 API 裡擷取許多有用資訊。如果你對音樂感興趣,有提供歌曲名稱、歌手、專輯的資訊 API。

下面是 API 調用的一個示例:

https://api.bigdatacloud.net/data/ip-geolocation-full?ip=27.30.84.181&localityLanguage=zh&key=bee73355d8ad4821a1c393c545e7f0

你通過浏覽器輸入以上網址,就可以發起一個簡單的 API 調用,結果如下:

{

"ip": "199.21.99.90",

"localityLanguageRequested": "zh",

"isReachableGlobally": true,

"country": {

"isoAlpha2": "US",
"isoAlpha3": "USA",
"m49Code": 840,
"name": "美國",
"isoName": "United States of America (the)",
"isoNameFull": "the United States of America",
"isoAdminLanguages": [
{
    "isoAlpha3": "eng",
    "isoAlpha2": "en",
    "isoName": "English",
    "nativeName": "English"
}
],
"unRegion": "Europe and Northern America/Northern America",
"currency": {
"numericCode": 840,
"code": "USD",
"name": "US Dollar",
"minorUnits": 2
},
"wbRegion": {
"id": "NAC",
"iso2Code": "XU",
"value": "North America"
},
"wbIncomeLevel": {
"id": "HIC",
"iso2Code": "XD",
"value": "High income"
},
"callingCode": "1",
"countryFlagEmoji": "           

上面節選了部分結果。

你可能會想,這不就是在浏覽器視窗輸入一個網址,然後回車擷取的(隻是 JSON 格式)資訊嗎?究竟 API 調用和普通的網址通路有什麼差別呢?如果不考慮 API 高大上的名稱,其實兩者沒啥差別。API 可以通過 HTTP 協定下載下傳檔案,和 URL 通路網站擷取資料的協定一樣。它可以實作所有現在網上幹的事情。API 之是以叫 API 而不叫網站的原因,其實是首先 API 有非常嚴謹的文法,其次 API 用 JSON 或 XML 格式表示資料,而不是 HTML 格式。

以上講解了 API 的相關概念,擷取 API 的資料,一般是 JSON 資料,我們看看在 Python 中如何解析 JSON 資料。

解析 JSON 資料

下面我們還是以剛才的例子,看看如何通過 API 擷取的 JSON 資料得到需要的結果:

import requests

class ScrapeAPI(object):

def __init__(self):
    self._api_url = 'https://api.bigdatacloud.net/data/ip-geolocation-full?ip=27.30.84.181&localityLanguage=zh&key=bee73355d8ad4821a1c19345e7f0'

def get_geolocation(self):
    init_session = requests.Session()
    response = init_session.get(self._api_url)
    json_result = response.json()
    get_country = json_result['country']['name']
    get_location = json_result['location']
    get_region = get_location['isoPrincipalSubdivision']
    get_city = get_location['city']
    get_locality_name = get_location['localityName']
    area = f'目前 IP 國家:{get_country},地區:{get_region},城市:{get_city},區劃:{get_locality_name}'
    print(area)

           

if name == '__main__':

ScrapeAPI().get_geolocation()           

以上代碼使用的是 requests 庫對 JSON 資料進行解析,運作代碼就可以得到我們需要的結果。

以上就是今天關于 API 相關的内容。

如果喜歡歡迎訂閱我的頻道。