在Python中使用请求进行API调用只返回一个项目而不是多个



一个很容易解决的问题,但不幸的是我是新手。问题是:我生成的csv文件只包含来自一个URL的数据,而我想要它们全部。

我已经列出了许多合同号,我正试图访问它们并将它们的数据返回到一个csv文件(一个长列表)。API的URL由一个baseURL和一个合同号加上一些参数组成,所以我的URL看起来是这样的(150个中的2个)https://api.nfz.gov.pl/app合资- api/agreements/edc47a7d a3b8 d354 - 79 - d5 a0518f8ba6d4?format=json& api版本= 1.2,限制= 25,页面= {}https://api.nfz.gov.pl/app-umw-api/agreements/9a6d9313-c9cc-c0db-9c86-b7b4be0e11c1?format=json& api版本= 1.2,= 25,限制页面= {}

出版商规定每页只能有25条记录,因此我在这里进行了一些分页。

程序似乎依次调用了每个URL,因为它打印了每次调用的页面数。但是csv只有4行,而不是数百行。我在想我哪里出错了。我试图通过删除最后3行缩进来修复(没有变化)和其他试验&错误。

另一个小问题-这4行实际上是重复的2行。我想我的代码在某个地方重复了第一页的结果,但我不知道在哪里。

另一个-我如何使csv文件的第一列显示"合同"(从我的列表"合同"),涉及到输出?我需要一些方法来识别csv中的哪些行来自哪个合同,而API将信息保存在数据"树"的单独分支中,我真的不知道如何有效地返回。

import requests
import pandas as pd
import math
from contracts_list1 import contracts
baseurl = 'https://api.nfz.gov.pl/app-umw-api/agreements/'
for contract in contracts:
api_url = ''.join([baseurl, contract])
def main_request(api_url):
r = requests.get(api_url)
return r.json()
def get_pages(response):
return math.ceil(response['meta']['count'] / 25)
p_number = main_request(api_url)
all_data = []
for page in range(0, get_pages(p_number)+1): # <-- increase page numbers here
data = requests.get(api_url.format(page)).json()
for a in data["data"]["plans"]:
all_data.append({**a["attributes"]})
df = pd.DataFrame(all_data)
df.to_csv('file1.csv', encoding='utf-8-sig', index=False)
print(get_pages(p_number))

您的累加器all_datecontracts循环内,因此每次迭代将覆盖上次迭代的结果。这就是为什么您只看到最后一次迭代的结果,而不是所有的结果。

试着把你的累加器all_data = []放在你的外部For循环之外:

import requests
import pandas as pd
import math
from contracts_list1 import contracts
baseurl = 'https://api.nfz.gov.pl/app-umw-api/agreements/'
all_data = []
for contract in contracts:
api_url = ''.join([baseurl, contract])
def main_request(api_url):
r = requests.get(api_url)
return r.json()
def get_pages(response):
return math.ceil(response['meta']['count'] / 25)
p_number = main_request(api_url)
for page in range(0, get_pages(p_number)+1): # <-- increase page numbers here
data = requests.get(api_url.format(page)).json()
for a in data["data"]["plans"]:
all_data.append({**a["attributes"]})
df = pd.DataFrame(all_data)
df.to_csv('file1.csv', encoding='utf-8-sig', index=False)
print(get_pages(p_number))

最新更新