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