来自带有模块 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()