[英]Python: how to extract data from Odata API that contains pages @odata.nextLink
我需要從 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": "application\json",
"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 :)
類似的東西會檢索所有的記錄,我相信(假設有@odata.nextLink
在json_data
確實):
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 的 Towards Data Science 的文章
他用一個好的腳本很好地解決了這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.