当我不知道最大页面数时,如何从 API 获取所有数据 - python、请求

问题描述 投票:0回答:1

我正在使用 API、Python 和 requests 包提取数据。我想提取所有数据,但只能提取 4,000 行。如何提取所有数据?响应中不存在页数。我不知道数据有多少行,但是有 4000 多行。

这是可以提取 4,000 行的工作代码,但一些细节需要保密:

headers = {
    'accept': '*/*',
    'Authorization': 'Bearer <generated_token_put_here>',
    'Content-Type': 'application/json',
    'verify':'/etc/ssl/certs/ca-certificates.crt'
}

data = '{"pageSize": 2000, "pageNumber": 100}' #his is the largest pageSize and pageNumber values that will still return data. 

response = requests.post('<api_endpoint_put_here>', headers=headers, verify=True, data=data)
python python-requests api-design
1个回答
0
投票

当您不知道总页数时,一个简单的方法是迭代页面,然后一旦您到达的页面少于预期行数,您就知道这是最后一页,或者是否有适合最后一页的确切行数,然后检查最后一页之后的页面将返回一组空数据。

这是一个实现(您可能需要根据 API 格式化数据的方式稍微调整一下:

import requests

headers = {
    'accept': '*/*',
    'Authorization': 'Bearer <generated_token_put_here>',
    'Content-Type': 'application/json',
    'verify': '/etc/ssl/certs/ca-certificates.crt'
}

page_size = 2000
page_number = 1
all_data = []

while True:

    data = f'{{"pageSize": {page_size}, "pageNumber": {page_number}}}'
    response = requests.post('<api_endpoint_put_here>', headers=headers, verify=True, data=data)
    
    if response.status_code != 200:
        print(f"Error: Received status code {response.status_code}")
        break
    
    response_data = response.json()  # Adjust if the response is not JSON
    if not response_data: # The previous page was the last page and had the same number of rows as pageSize
        break
    
    all_data.extend(response_data)  # or something like response_data['items'] if data is nested under 'items'
    
    if len(response_data) < page_size: # you've reached the last page
        break
    
    page_number += 1

print(f"Total rows pulled: {len(all_data)}")
© www.soinside.com 2019 - 2024. All rights reserved.