Я извлекаю данные из остальных API. Проблема в том, что размер данных огромен, поэтому ответ разбит на страницы. Я обошел это, сначала прочитав количество страниц данных, а затем повторив запрос для каждой страницы. Единственная проблема здесь заключается в том, что общее количество страниц составляет около 1,5 КБ, что требует огромного количества времени для фактической выборки и добавления в 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 по умолчанию.
Второй вариант: потенциально вы можете извлекать более одной страницы за раз, используя несколько потоков/процессов и разделяя ту часть страниц, за которую каждый отвечает.
похоже, у меня сработало обновление поля per_page! Спасибо!
Вы можете использовать несколько потоков. Для справки см. этот вопрос stackoverflow.com/questions/3033952/…