應用程式設計接口(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 相關的内容。
如果喜歡歡迎訂閱我的頻道。