來自帶有模組 json 和請求的 Web API 的 ETL

首先,匯入模組並設定連線字串。如果需要引數,可以直接將它們放在 URL 字串(本例中為 API)中,也可以將它們構建為 dict 並將它們傳遞給 params 引數。

import requests
import json

params = {'id': 'blahblah', 'output': 'json'} # You could use https://www.somesite.com/api/query?id=blahblah&output=json directly.
API = 'https://www.somesite.com/api/query'
APIcred = 'username','password'

請求自動處理 HTTPBasicAuth 和 HTTPDigestAuth。此示例 API 將返回 JSON 字串。發出 GET 請求並捕獲輸出。針對錯誤的 HTTP 狀態引發錯誤。

r = requests.get(API, params = params, auth = APIcred)
r.raise_for_status()
#print(r.status) # Optionally print HTTP status code

將 JSON 字串轉換為可以使用的 python 物件。JSON 看起來在視覺上類似於 python dict,但在 null,true / false 等方面存在顯著差異。

r_dict = json.loads(r.text)
print(r_dict)

想象一下,你剛剛列印的輸出來自多行多列資料庫,難以閱讀:

{‘row’:[{‘Country’:‘United States’,‘pid’:‘cc12608f-4591-46d7-b8fe-6222e4cde074’,‘Status’:’’,‘FormerLastName’:’’,‘Degree’: ‘工商管理’},{‘國家’:‘英國’,‘pid’:‘c9f2c6f7-f736-49d3-8adf-fd8d533bbd58’,‘狀態’:’’,‘FormerLastName’:’’,‘學位’:‘綜合管理’}]}

你可以使用 json.dumps() 列印()更易讀的版本。下面的行將 python 物件編碼為帶有製表符的 JSON 字串並列印出來。

print(json.dumps(r_dict, indent = 4))

輸出:

{
    "row": [
        {
            "Country": "United States",
            "pid": "cc12608f-4591-46d7-b8fe-6222e4cde074",
            "Status": "",
            "FormerLastName": "",
            "Degree": "Business Administration"
        },
        {
            "Country": "Britain",
            "pid": "c9f2c6f7-f736-49d3-8adf-fd8d533bbd58",
            "Status": "",
            "FormerLastName": "",
            "Degree": "General Management"
        }
    ]
}

你可以像這樣訪問 dict 中的巢狀元素:

print(some_dict['BuildingA']['Room12'])

但是我們的示例在陣列中有任意數量的物件,它本身巢狀為鍵的值! 這些可以使用行號訪問,從 0 開始。

讓我們將國家值中的一個從英國改為阿爾巴尼亞

r_dict['row'][1]['Country'] = 'Albania'

現在讓我們將這些資料傳送到另一個 API。請求可以直接接受 dson 引數的 dict,而不是使用 json.dumps() 編碼字串。

r = requests.post('https://www.somesite.com/" + 'api/carrots', json = r_dict, auth = APIcred)
r.raise_for_status()