Python - как извлечь данные с помощью циклического разбиения по страницам на API (Harvest)
Прежде всего, я работал с Python около двух дней, поэтому я не обязательно знаю лучшие практики или всю терминологию... пока. Я лучше учусь с помощью обратного инжиниринга, и мой код ниже основан на официальной документации от Harvest и других битах, которые я нашел с помощью Google-Fu
Моя просьба загрузить все записи записей времени из Harvest и сохранить их в формате JSON (или, в идеале, в формате CSV).
Официальный пример Python от Harvest Git Hub
Это мой адаптированный код (включая все выходные данные, которые не будут необходимы в конечном коде, но пригодятся для моего обучения):
import requests, json, urllib.request
#Set variables for authorisation
AUTH = "REDACTED"
ACCOUNT = "REDACTED"
URL = "https://api.harvestapp.com/v2/time_entries"
HEADERS = { "Authorization": AUTH,
"Harvest-Account-ID": ACCOUNT}
PAGENO = str("5")
request = urllib.request.Request(url=URL+"?page="+PAGENO, headers=HEADERS)
response = urllib.request.urlopen(request, timeout=5)
responseBody = response.read().decode("utf-8")
jsonResponse = json.loads(responseBody)
# Find the values for pagination
parsed = json.loads(responseBody)
links_first = parsed["links"]["first"]
links_last = parsed["links"]["last"]
links_next = parsed["links"]["next"]
links_previous = parsed["links"]["previous"]
nextpage = parsed["next_page"]
page = parsed["page"]
perpage = parsed["per_page"]
prevpage = parsed["previous_page"]
totalentries = parsed["total_entries"]
totalpages = parsed["total_pages"]
#Print the output
print(json.dumps(jsonResponse, sort_keys=True, indent=4))
print("first link : " + links_first)
print("last link : " + links_last)
print("next page : " + str(nextpage))
print("page : " + str(page))
print("per page : " + str(perpage))
print("total records : " + str(totalentries))
print("total pages : " + str(totalpages))
Выходной ответ
"Сжатый текст (5816 строк)"
первая ссылка: https://api.harvestapp.com/v2/time_entries?page=1&per_page=100
последняя ссылка: https://api.harvestapp.com/v2/time_entries?page=379&per_page=100
следующая страница: 6
страница: 5
за страницу: 100
всего записей: 37874
всего страниц: 379
Кто-нибудь может посоветовать лучший способ перебрать страницы, чтобы сформировать один файл JSON? Если вы также можете посоветовать лучший способ, выведите этот файл JSON, я был бы очень признателен.
0 ответов
Я использовал следующий код для получения всех записей времени. Возможно, это может быть немного более эффективным, но это работает. Функция get_all_time_entries перебирает все страницы и добавляет ответ в формате JSON в массив all_time_entries и, наконец, возвращает этот массив.
import requests
import json
def get_all_time_entries():
url_address = "https://api.harvestapp.com/v2/time_entries"
headers = {
"Authorization": "Bearer " + "xxxxxxxxxx",
"Harvest-Account-ID": "xxxxxx"
}
# find out total number of pages
r = requests.get(url=url_address, headers=headers).json()
total_pages = int(r['total_pages'])
# results will be appended to this list
all_time_entries = []
# loop through all pages and return JSON object
for page in range(1, total_pages):
url = "https://api.harvestapp.com/v2/time_entries?page="+str(page)
response = requests.get(url=url, headers=headers).json()
all_time_entries.append(response)
page += 1
# prettify JSON
data = json.dumps(all_time_entries, sort_keys=True, indent=4)
return data
print(get_all_time_entries())
Вы можете легко направить вывод скрипта с помощью ">" в локальную папку при запуске в powershell и т. Д.
Например:
Python.exe example.py> C: \ temp \ all_time_entries.json
Надеюсь это поможет!
Есть библиотека Python, поддерживающая Harvest API v2.
Библиотека поддерживает все методы аутентификации, ограничение скорости запросов, коды ответов и имеет классы данных для каждого объекта ответа.
Библиотека очень хорошо протестирована, поэтому у вас будет пример использования каждой конечной точки в тестах. В тестах используются официальные примеры Harvest.
Кроме того, есть пример подробного отчета о времени, который наследует объект Harvest. Тесты для подробного отчета о времени показывают, как его использовать.
Ссылка на библиотеку находится в каталоге программного обеспечения Harvest;https://www.getharvest.com/integrations/python-library
URL проекта;https://github.com/bradbase/python-harvest_apiv2
Я владею проектом.
from harvest import Harvest
from .harvestdataclasses import *
class MyTimeEntries(Harvest):
def __init__(self, uri, auth):
super().__init__(uri, auth)
def time_entries(self):
time_entry_results = []
time_entries = self.time_entries()
time_entry_results.extend(time_entries.time_entries)
if time_entries.total_pages > 1:
for page in range(2, time_entries.total_pages + 1):
time_entries = self.time_entries(page=page)
time_entry_results.extend(time_entries.time_entries)
return time_entry_results
personal_access_token = PersonalAccessToken('ACCOUNT_NUMBER', 'PERSONAL_ACCESS_TOKEN')
my_report = MyTimeEntries('https://api.harvestapp.com/api/v2', personal_access_token)
time_entries = my_report.time_entries()