python - 使用 Python 从 REST API 获取大型分页数据
问题描述
我正在从一个休息 API 中提取数据。问题是数据量很大,因此响应是分页的。我通过首先读取有多少页数据然后迭代每个页面的请求来解决它。这里唯一的问题是页面总数约为 1.5K,这需要大量时间来实际获取并附加到 CSV。有没有更快的解决方法?
这是我要定位的端点:https ://developer.keeptruckin.com/reference#get-logs
import requests
import json
import csv
url='https://api.keeptruckin.com/v1/logs?start_date=2019-03-09'
header={'x-api-key':'API KEY HERE'}
r=requests.get(url,headers=header)
result=r.json()
result = json.loads(r.text)
num_pages=result['pagination']['total']
print(num_pages)
for page in range (2,num_pages+1):
r=requests.get(url,headers=header, params={'page_no': page})
result=r.json()
result = json.loads(r.text)
csvheader=['First Name','Last Name','Date','Time','Type','Location']
with open('myfile.csv', 'a+', newline='') as csvfile:
writer = csv.writer(csvfile, csv.QUOTE_ALL)
##writer.writerow(csvheader)
for log in result['logs']:
username = log['log']['driver']['username']
first_name=log['log']['driver']['first_name']
last_name=log['log']['driver']['last_name']
for event in log['log']['events']:
start_time = event['event']['start_time']
date, time = start_time.split('T')
event_type = event['event']['type']
location = event['event']['location']
if not location:
location = "N/A"
if (username=="barmx1045" or username=="aposx001" or username=="mcqkl002" or username=="coudx014" or username=="ruscx013" or username=="loumx001" or username=="robkr002" or username=="masgx009"or username=="coxed001" or username=="mcamx009" or username=="linmx024" or username=="woldj002" or username=="fosbl004"):
writer.writerow((first_name, last_name,date, time, event_type, location))
解决方案
第一个选项:大多数分页响应都有一个您可以编辑的页面大小。 https://developer.keeptruckin.com/reference#pagination 尝试将 per_page 字段更新为 100,而不是默认的每次拉取 25。
第二种选择:通过使用多个线程/进程并拆分每个页面负责的部分,您可能一次可以拉出多个页面。
推荐阅读
- html - 如何使用弹性容器
- string - 用文件中的变量替换字符串
- excel - 不要根据时间戳更新链接的 Excel 单元格
- git - 如何使用控制台命令行进行 git 合并以查看 gitkraken 软件中的分支?
- mysql - 获取多个产品属性作为“catalog_product_entity”上的列
- javascript - 如何立即滚动到位置?
- javascript - 如何在 Angular 应用程序启动之间保持 JS 对象的引用?
- module - Drupal 7 上是否有像社交媒体一样的评论和点赞模块
- google-cloud-platform - 在运行多个 VM 时访问两个不同的 Jupyter
- string - 从已知子串开始提取已知长度的子串