Python:如何从包含页面@Odata.nextLink的Odata API中提取数据



我需要从Odata API中提取数据。使用下面的代码,我确实收到了数据,但只有250行。

JSON包含一个名为:@odata.nextLink的密钥,该密钥包含一个值,这就是BASE_URL + endpoint + ?$skip=250

如何循环浏览下一页?

import requests
import pandas as pd
import json
BASE_URL = "base_url"

def session_token():
url = BASE_URL + '/api/oauth/token'
headers = {"Accept": "applicationjson",
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"}
body = {"username":"user",
"password": "pwd",
"grant_type": "password"}
return "Bearer "+ requests.post(url, headers = headers, data = body).json()["access_token"]
def make_request(endpoint, token = session_token()):
headers = {"Authorization": token}
response = requests.get(BASE_URL + endpoint, headers = headers)
if response.status_code == 200:
json_data = json.loads(response.text)
return json_data

make_request("/odata/endpoint")

根据@Marek Piotrowski的建议,我修改并找到了一个解决方案:

def main():
url = "endpoint"
while True:
if not url:
break
response = make_request("endpoint")
if response.status_code == 200:
json_data = json.loads(response.text)
url = json_data["@odata.nextLink"] # Fetch next link
yield json_data['value']
result = pd.concat((json_normalize(row) for row in main()))
print(result) # Final dataframe, works like a charm :)

我相信,类似的东西可以检索所有记录(假设json_data中确实有@odata.nextLink(:

def retrieve_all_records(endpoint, token = session_token()):
all_records = []
headers = {"Authorization": token}
url = BASE_URL + endpoint
while True:
if not url:
break
response = requests.get(url, headers = headers)
if response.status_code == 200:
json_data = json.loads(response.text)
all_records = all_records + json_data['records']
url = json_data['@odata.nextLink']
return all_records

不过,该代码尚未经过测试。如果有效,请告诉我。或者,我相信您可以对make_request进行一些递归调用,但您必须将结果存储在函数本身之上的某个位置。

我知道这已经很晚了,但你可以看看Ephram Mwai 的《走向数据科学》中的这篇文章

他用一个好剧本很好地解决了这个问题。

最新更新