Содержание страницы
В этом уроке по API Python мы узнаем, как получать данные для проектов по науке о данных. В Интернете существуют миллионы API, которые предоставляют доступ к данным. Такие сайты, как Bitrix24, AmoCRM, Yandex API, Twitter, Instagram, VK и Facebook, предлагают определенные данные через свои API. Это могут быть данные предоставляемые только тем, у кого есть access_token, либо API с открытым доступом.
Python API Tutorial: Примеры GET POST AUTH requests (HTTP запросов). Структура запроса GET и POST. Выгрузка данных из API облачных систем
Чтобы использовать API, вы отправляете запрос на удаленный веб-сервер и извлекаете необходимые данные.
Что такое API?
API (Application Programming Interface) или интерфейс прикладного программирования — это сервер, который вы можете использовать для извлечения и отправки данных с использованием кода (запросов). API-интерфейсы чаще всего используются для извлечения данных, и это будет основной темой этого урока для начинающих.
Когда мы хотим получить данные из API, нам нужно сделать запрос. Запросы используются во всем Интернете. Например, когда вы открываете страницу сайта, то сначала ваш веб-браузер отправляет URL-запрос на веб-сервер хостинга (где расположен сайт), а хостинг возвращает некоторое содержимое этой веб-страницы.
Запросы API работают точно так же — вы отправляете запрос на сервер API для данных, а сервер возвращает ответ. API Необходимы для того, чтобы не давать прямой доступ к базе данных. Т.к. при прямом доступе к БД очень велика вероятность неправильных действий, что может привести к различным ошибкам.
GET и POST запросы с использованием Python
Существует два метода запросов HTTP (протокол передачи гипертекста): запросы GET и POST в Python.
Что такое HTTP/HTTPS?
HTTP — это набор протоколов, предназначенных для обеспечения связи между клиентами и серверами. Он работает как протокол запроса-ответа между клиентом и сервером.
Веб-браузер может быть клиентом, а приложение на компьютере, на котором размещен веб-сайт, может быть сервером.
Итак, чтобы запросить ответ у сервера, в основном используют два метода:
- GET: запросить данные с сервера. Т.е. мы отправляем только URL (HTTP) запрос без данных. Метод HTTP GET предназначен для получения информации от сервера. В рамках GET-запроса некоторые данные могут быть переданы в строке запроса URI в формате параметров (например, условия поиска, диапазоны дат, ID Объекта, номер счетчика и т.д.).
- POST: отправить данные для обработки на сервер (и получить ответ от сервера). Мы отправляем набор информации, набор параметров для API. Метод запроса POST предназначен для запроса, при котором веб-сервер принимает данные, заключённые в тело сообщения POST запроса.
Чтобы сделать HTTP-запросы в python, мы можем использовать несколько HTTP-библиотек, таких как:
Самая элегантная и простая из перечисленных выше библиотек — это Requests. Библиотека запросов не является частью стандартной библиотеки Python, поэтому вам нужно установить ее, чтобы начать работать с ней.
Если вы используете pip для управления вашими пакетами Python, вы можете устанавливать запросы, используя следующую команду:
pip install requests
Если вы используете conda, вам понадобится следующая команда:
conda install requests
После того, как вы установили библиотеку, вам нужно будет ее импортировать. Давайте начнем с этого важного шага:
import requests
Синтаксис / структура получения данных через GET/POST запросы к API
Есть много разных типов запросов. Наиболее часто используемый, GET запрос, используется для получения данных.
Когда мы делаем запрос, ответ от API сопровождается кодом ответа, который сообщает нам, был ли наш запрос успешным. Коды ответов важны, потому что они немедленно сообщают нам, если что-то пошло не так.
Чтобы сделать запрос «GET», мы будем использовать requests.get()
функцию.
Метод post()
используется, когда вы хотите отправить некоторые данные на сервер.
Ниже приведена подборка различных примеров использования запросов GET и POST через библиотеку REQUESTS. Безусловно, существует еще больше разных случаев. Всегда прежде чем, писать запрос, необходимо обратиться к официальной документации API (например, у Yandex есть документация к API различных сервисов, у Bitrix24 есть документация к API, у AmoCRM есть дока по API, у сервисов Google есть дока по API и т.д.). Вы смотрите какие методы есть у API, какие запросы API принимает, какие данные нужны для API, чтобы он мог выдать информацию в соответствии с запросом. Как авторизоваться, как обновлять ключи доступа (access_token). Все эти моменты могут быть реализованы по разному и всегда нужно ответ искать в официальной документации у поставщика API.
#GET запрос без параметров response = requests.get('https://api-server-name.com/methodname_get') #GET запрос с параметрами в URL response = requests.get("https://api-server-name.com/methodname_get?param1=ford¶m2=-234¶m3=8267") # URL запроса преобразуется в формат https://api-server-name.com/methodname_get?key2=value2&key1=value1 param_request = {'key1': 'value1', 'key2': 'value2'} response = requests.get('https://api-server-name.com/methodname_get', params=param_request) #GET запрос с заголовком url = 'https://api-server-name.com/methodname_get' headers = {'user-agent': 'my-app/0.0.1'} response = requests.get(url, headers=headers) #POST запрос с параметрами в запросе response = requests.post('https://api-server-name.com/methodname_post', data = {'key':'value'}) #POST запрос с параметрами через кортеж param_tuples = [('param1', 'value1'), ('param1', 'value2')] response = requests.post('https://api-server-name.com/methodname_post', data=param_tuples) #POST запрос с параметрами через словарь param_dict = {'param': ['value1', 'value2']} response = requests.post('https://api-server-name.com/methodname_post', data=payload_dict) #POST запрос с параметрами в формате JSON import json url = 'https://api-server-name.com/methodname_post' param_dict = {'param': 'data'} response = requests.post(url, data=json.dumps(param_dict))
Коды состояния API
Коды состояния возвращаются при каждом запросе к веб-серверу. Коды состояния указывают информацию о том, что произошло с запросом.
Ответы сгруппированы в пять классов:
- Информационные ответы (
100
—199
), - Успешные ответы (
200
—299
), - Перенаправления (
300
—399
), - Ошибки клиента (
400
—499
), - и ошибки сервера (
500
—599
).
Вот некоторые коды, которые относятся к запросам GET:
200
: Все прошло хорошо и результат был возвращен (если есть).301
: Сервер перенаправляет вас на другую конечную точку. Это может произойти, когда компания меняет доменные имена или имя конечной точки изменяется.400
: Сервер считает, что вы сделали неверный запрос. Это может произойти, если вы отправите неверные данные.401
: Сервер думает, что вы не аутентифицированы. Для многих API требуются учетные данные для входа, поэтому код 401 случается, когда вы отправляете неверные учетные данные для доступа к API.403
: Ресурс, к которому вы пытаетесь получить доступ, запрещен: у вас нет прав для его просмотра.404
: Ресурс, к которому вы пытались получить доступ, не найден на сервере.503
: Сервер не готов обработать запрос.
Посмотреть информацию по другим ошибкам можно по ссылке HTTP response status codes.
Работа с данными JSON в Python
JSON (JavaScript Object Notation) — это язык API. JSON — это способ кодирования структур данных, который простоту чтения данных машинами. JSON — это основной формат, в котором данные передаются туда и обратно в API, и большинство серверов API отправляют свои ответы в формате JSON.
JSON выглядит так, как будто он содержит словари, списки, строки и целые числа Python. Вы можете думать о JSON как о комбинации этих объектов, представленных в виде строк.
Рассмотрим пример:
Python имеет отличный инструментарий для работы с данными в формате JSON (пакет json — является частью стандартной библиотеки). Мы можем конвертировать списки и словари в JSON, а также конвертировать строки в списки и словари.
Библиотека JSON имеет две основные функции:
json.dumps()
— принимает объект Python и преобразует его в строку.json.loads()
— принимает строку JSON и преобразует (загружает) ее в объект Python.
Функция dumps()
особенно полезна, поскольку мы можем использовать ее для печати отформатированной строки, которая облегчает понимание вывода JSON.
Рассмотрим пример:
# Импорт библиотеки requests import requests # Запрос GET (Отправка только URL без параметров) response = requests.get("http://api.open-notify.org/astros.json") # Вывод кода print(response.status_code) # Вывод ответа, полученного от сервера API print(response.json())
Результат:
200 {'people': [{'craft': 'ISS', 'name': 'Andrew Morgan'}, {'craft': 'ISS', 'name': 'Oleg Skripochka'}, {'craft': 'ISS', 'name': 'Jessica Meir'}], 'message': 'success', 'number': 3}
Теперь попробуем применить функцию dump() — структура данных станет более наглядна:
# Импорт библиотеки requests import requests # Импорт библиотеки json import json def jprint(obj): # create a formatted string of the Python JSON object text = json.dumps(obj, sort_keys=True, indent=4) print(text) # Запрос GET (Отправка только URL без параметров) response = requests.get("http://api.open-notify.org/astros.json") # Вывод ответа, через пользовательскую функцию jprint jprint(response.json())
Результат:
{ "message": "success", "number": 3, "people": [ { "craft": "ISS", "name": "Andrew Morgan" }, { "craft": "ISS", "name": "Oleg Skripochka" }, { "craft": "ISS", "name": "Jessica Meir" } ] }
Дополнительные команды для просмотра параметров Response библиотеки Requests Python
Пример скрипта Python:
# Импорт библиотеки requests import requests # Запрос GET (Отправка только URL без параметров) response = requests.get("http://api.open-notify.org/iss-pass.json?lat=40.71&lon=-74") # Вывод ответа, через пользовательскую функцию jprint print("response:\n{}\n\n".format(response)) print("response.url:\n{}\n\n".format(response.url)) #Посмотреть формат URL (с параметрами) print("response.headers:\n{}\n\n".format(response.headers)) #Header of the request print("response.status_code:\n{}\n\n".format(response.status_code)) #Получить код ответа print("response.text:\n{}\n\n".format(response.text)) #Text Output print("response.encoding:\n{}\n\n".format(response.encoding)) #Узнать, какую кодировку использует Requests print("response.content:\n{}\n\n".format(response.content)) #В бинарном виде print("response.json():\n{}\n\n".format(response.json())) #JSON Output
Результат:
response: <Response [200]> response.url: http://api.open-notify.org/iss-pass.json?lat=40.71&lon=-74 response.headers: {'Server': 'nginx/1.10.3', 'Date': 'Tue, 07 Apr 2020 05:44:13 GMT', 'Content-Type': 'application/json', 'Content-Length': '519', 'Connection': 'keep-alive', 'Via': '1.1 vegur'} response.status_code: 200 response.text: { "message": "success", "request": { "altitude": 100, "datetime": 1586237266, "latitude": 40.71, "longitude": -74.0, "passes": 5 }, "response": [ { "duration": 540, "risetime": 1586273822 }, { "duration": 654, "risetime": 1586279549 }, { "duration": 596, "risetime": 1586285414 }, { "duration": 561, "risetime": 1586291303 }, { "duration": 623, "risetime": 1586297135 } ] } response.encoding: None response.content: b'{\n "message": "success", \n "request": {\n "altitude": 100, \n "datetime": 1586237266, \n "latitude": 40.71, \n "longitude": -74.0, \n "passes": 5\n }, \n "response": [\n {\n "duration": 540, \n "risetime": 1586273822\n }, \n {\n "duration": 654, \n "risetime": 1586279549\n }, \n {\n "duration": 596, \n "risetime": 1586285414\n }, \n {\n "duration": 561, \n "risetime": 1586291303\n }, \n {\n "duration": 623, \n "risetime": 1586297135\n }\n ]\n}\n' response.json(): {'message': 'success', 'request': {'altitude': 100, 'datetime': 1586237266, 'latitude': 40.71, 'longitude': -74.0, 'passes': 5}, 'response': [{'duration': 540, 'risetime': 1586273822}, {'duration': 654, 'risetime': 1586279549}, {'duration': 596, 'risetime': 1586285414}, {'duration': 561, 'risetime': 1586291303}, {'duration': 623, 'risetime': 1586297135}]}
Примеры запросов GET с использованием библиотеки REQUESTS в PYTHON
Рассмотрим первый пример получения данных из Yandex Метрика API данных через метод get библиотеки requests.
Выгрузка данных из Яндекс Метрики с помощью библиотеки Requests.Get
Код запроса (номер счетчика и токен изменены):
# Импортируем библиотеку requests import requests # Адрес api метода для запроса get url_param = "https://api-metrika.yandex.net/stat/v1/data" # Задаем параметры для API api_param = { "ids":"5251515", "metrics":"ym:s:users,ym:s:visits,ym:s:pageviews,ym:s:bounceRate,ym:s:pageDepth,ym:s:avgVisitDurationSeconds", "dimensions":"ym:s:date,ym:s:<attribution>TrafficSource,ym:s:<attribution>SourceEngine,ym:s:gender", "date1":"10daysAgo", "date2":"yesterday", "sort":"ym:s:date", "accuracy":"full", "limit":5 } header_params = { 'GET': '/management/v1/counters HTTP/1.1', 'Host': 'api-metrika.yandex.net', 'Authorization': 'OAuth AgAAlkjlkjKAa976ZB-rXh-t-ookfJJcMP979ZU0', 'Content-Type': 'application/x-yametrika+json' } # Отправляем get request (запрос GET) response = requests.get( url_param, params=api_param, headers=header_params ) result = response.json() query = result['query'] data = result['data'] print(query) print('======================') print(data)
Результат:
{'ids': [5251515], 'dimensions': ['ym:s:date', 'ym:s:lastTrafficSource', 'ym:s:lastSourceEngine', 'ym:s:gender'], 'metrics': ['ym:s:users', 'ym:s:visits', 'ym:s:pageviews', 'ym:s:bounceRate', 'ym:s:pageDepth', 'ym:s:avgVisitDurationSeconds'], 'sort': ['ym:s:date'], 'date1': '2020-04-02', 'date2': '2020-04-11', 'limit': 5, 'offset': 1, 'group': 'Week', 'auto_group_size': '1', 'quantile': '50', 'offline_window': '21', 'attribution': 'Last', 'currency': 'RUB', 'adfox_event_id': '0'} ====================== [{'dimensions': [{'name': '2020-04-02'}, {'name': 'Internal traffic', 'icon_id': '-1', 'icon_type': 'traffic-source', 'id': 'internal'}, {'name': 'mydomain.ru', 'id': 'internal.mydomain.ru', 'favicon': 'mydomain.ru'}, {'name': 'Not specified', 'id': None}], 'metrics': [1.0, 1.0, 1.0, 0.0, 1.0, 16.0]}, {'dimensions': [{'name': '2020-04-02'}, {'name': 'Internal traffic', 'icon_id': '-1', 'icon_type': 'traffic-source', 'id': 'internal'}, {'name': 'mydomain.ru', 'id': 'internal.mydomain.ru', 'favicon': 'mydomain.ru'}, {'name': 'male', 'id': 'male'}], 'metrics': [3.0, 5.0, 8.0, 0.0, 1.6, 194.4]}, {'dimensions': [{'name': '2020-04-02'}, {'name': 'Internal traffic', 'icon_id': '-1', 'icon_type': 'traffic-source', 'id': 'internal'}, {'name': 'mydomain.ru', 'id': 'internal.mydomain.ru', 'favicon': 'mydomain.ru'}, {'name': 'female', 'id': 'female'}], 'metrics': [8.0, 9.0, 16.0, 0.0, 1.77777778, 91.77777778]}, {'dimensions': [{'name': '2020-04-02'}, {'name': 'Direct traffic', 'icon_id': '0', 'icon_type': 'traffic-source', 'id': 'direct'}, {'name': None, 'id': None, 'favicon': None}, {'name': 'Not specified', 'id': None}], 'metrics': [23.0, 29.0, 37.0, 44.82758621, 1.27586207, 34.79310345]}, {'dimensions': [{'name': '2020-04-02'}, {'name': 'Direct traffic', 'icon_id': '0', 'icon_type': 'traffic-source', 'id': 'direct'}, {'name': None, 'id': None, 'favicon': None}, {'name': 'male', 'id': 'male'}], 'metrics': [32.0, 50.0, 63.0, 4.0, 1.26, 44.74]}]
Получим цены на нефть в формате JSON с ресурса oilpriceapi.com
Для получения токена, необходимо пройти регистрацию на сайте oilpriceapi.com.
Пример для токена 984a45fflkj09j9870ujkheca7jj977658 (у вас будет свой ключ доступа):
# Импортируем библиотеку requests import requests # Адрес api метода для запроса get url = 'https://api.oilpriceapi.com/v1/prices/latest' headers = { 'Authorization': 'Token 984a45fflkj09j9870ujkheca7jj977658', 'Content-Type': 'application/json' } # Отправляем get request (запрос GET) response = requests.get(url = url, headers = headers) data = response.json() print(data)
Результат в формате json:
{'status': 'success', 'data': {'price': 30.08, 'formatted': '$30.08', 'currency': 'USD', 'code': 'BRENT_CRUDE_USD', 'created_at': '2020-04-14T21:50:00.585Z', 'type': 'spot_price'}}
Загрузить курс валют с помощью Requests GET в Python Pandas cbr.ru
Пример загрузки курсов валют по конкретному дню в DataFrame Pandas Python. Курс валюты отдается в формате XML, поэтому нам понадобится дополнительная библиотека xml.etree.ElementTree:
# Импортируем библиотеку requests import requests import pandas as pd import xml.etree.ElementTree as et v_date = '16.04.2020' # Адрес api метода для запроса get url = 'https://www.cbr.ru/scripts/XML_daily.asp' params = { 'date_req': v_date } # Отправляем get request (запрос GET) response = requests.get(url, params) tree = et.ElementTree(et.fromstring(response.text)) root = tree.getroot() df_cols = ["date", "numcode", "charcode", "nominal", "name", "value"] rows = [] for node in root: s_numcode = node.find("NumCode").text if node is not None else None s_charcode = node.find("CharCode").text if node is not None else None s_nominal = node.find("Nominal").text if node is not None else None s_name = node.find("Name").text if node is not None else None s_value = node.find("Value").text if node is not None else None rows.append({"date": v_date, "numcode": s_numcode, "charcode": s_charcode, "nominal": s_nominal, "name": s_name, "value": s_value}) df = pd.DataFrame(rows, columns = df_cols) print(df.head())
Результат:
date numcode ... name value 0 16.04.2020 036 ... Австралийский доллар 46,7719 1 16.04.2020 944 ... Азербайджанский манат 43,4509 2 16.04.2020 826 ... Фунт стерлингов Соединенного королевства 92,2684 3 16.04.2020 051 ... Армянских драмов 15,1801 4 16.04.2020 933 ... Белорусский рубль 30,0814 [5 rows x 6 columns]
Получаем данные по вакансиям с сайта hh.ru через API с помощью Python Requests Get
У сайта hh есть API, вся свежая информация находится на сайте https://dev.hh.ru/ и в документации https://github.com/hhru/api. В рамках примера будет использован метод vacancies.
Скрипт запроса:
# Импортируем библиотеку requests import requests import pandas as pd page_number = 0 search_str = "qlik" area_str = "1" # Адрес api метода для запроса get url = 'https://api.hh.ru/vacancies' param = { "text":search_str, "area":area_str, "page":page_number } # Отправляем get request (запрос GET) response = requests.get(url,param) data = response.json() #Создаем пустой dict (словать данных) dict_data = {} dict_number = 0 # Количество страниц for i in range(0,data['pages']): param_cycle = { "text":search_str, "area":area_str, "page":i } response_cycle = requests.get(url,param_cycle) print("ЗАПРОС №" + str(i)) result = dict(response_cycle.json()) result = result['items'] #Парсим исходный list формата Json в dictionary (словарь данных) for y in range(0, len(result)-1): dict_data[dict_number] = { 'id':result[y]['id'], 'premium':result[y]['premium'], 'name':result[y]['name'], 'department':result[y]['department'], 'has_test':result[y]['has_test'], 'area_name':result[y]['area']['name'], 'salary':result[y]['salary'], 'type_name':result[y]['type']['name'], 'snippet_requirement':result[y]['snippet']['requirement'] } dict_number = dict_number + 1 print("==================================") print(dict_data[0])
Результат выполнения скрипта:
ЗАПРОС №0 ================================== ЗАПРОС №1 ================================== ЗАПРОС №2 ================================== ЗАПРОС №3 ================================== ЗАПРОС №4 ================================== ЗАПРОС №5 ================================== {'id': '36694453', 'premium': False, 'name': 'Аналитик', 'department': None, 'has_test': False, 'area_name': 'Москва', 'salary': None, 'type_name': 'Открытая', 'snippet_requirement': 'Продвинутый пользователь MS Exсel, SQL - простые запросы, пользователь одной или нескольких BI систем - Tableu, <highlighttext>Qlik</highlighttext> sense, Power BI, Microstrategy. '}
Пример выгрузки данных из Bitrix24 с использованием requests, pandas и Thread
import os import requests import pandas as pd from urllib.request import urlopen from threading import Thread class DownloadThread(Thread): """ Пример многопоточной загрузки данных из Bitrix24 """ def __init__(self, item, name, url_param, start_param, total, method_name): """Инициализация потока""" Thread.__init__(self) self.item = item self.name = name self.url_param = url_param self.start_param = start_param self.total = total self.method_name = method_name def run(self): """Запуск потока""" msg_start = "Поток %s стартовал загрузку start_param = %s, total = %s" % (self.name, self.start_param, self.total) print("") result_data=[] for i in range (self.start_param, self.total, 50): # Задаем параметры для API param = { "start": str(i) } # Отправляем get request (запрос GET) response = requests.get(self.url_param,param) result = response.json() data = result['result'] result_data += data dict_data = {} for j in range(0,len(result_data)): dict_data[j] = dict(result_data[j]) #Создаем DataFrame из dict (словаря данных или массива данных) dict_keys = dict_data[0].keys() df = pd.DataFrame.from_dict(dict_data, orient='index',columns=dict_keys) df = df.replace('\n',' ', regex=True) df.to_excel(self.method_name + "_" + str(self.item) + ".xlsx", sheet_name='data', index=False) msg_end = "Поток %s завершил загрузку start_param = %s, total = %s" % (self.name, self.start_param, self.total) print(msg_end) print("") def main(url_param, list_totals, step, total_param, method_name): """ Запуск программы """ start_param = 0 for item, val in enumerate(list_totals): name = "Поток %s" % (item+1) print(name) if (val + step)<=total_param: total = val + step else: total = total_param thread = DownloadThread(item, name, url_param, start_param, total, method_name) thread.start() start_param = total if __name__ == "__main__": # method method_name = "crm.deal.list" # Адрес api метода для запроса get url_param = "https://crm.domain.ru/rest/1/56kjhoghius78yfpojj90/" + method_name response = requests.get(url_param) result = response.json() total_param = result['total'] step = 10000 print(total_param) list_totals = list(range(0,total_param,step)) main(url_param, list_totals, step, total_param, method_name)
Примеры запросов POST с использованием библиотеки REQUESTS в PYTHON
Выгрузка данных из Bitrix24 с фильтром по дате из REST API
import requests # method method_name = "crm.deal.list" # Адрес api метода для запроса get url_param = "https://domain.ru/rest/1/854984lkjdsijd432/" + method_name params = {"filter[>DATE_CREATE]": "2020-01-01T00:00:01+01:00"} print(params) response = requests.post(url_param, data = params) result = response.json() total = result['total'] print(total)
Выгрузка данных из Bitrix24 с двумя фильтрами по дате из REST API
import requests # method method_name = "crm.deal.list" # Адрес api метода для запроса get url_param = "https://domain.ru/rest/1/854984lkjdsijd432/" + method_name params = { "filter[<DATE_CREATE]":"2019-01-01T00:00:01+01:00", "filter[>DATE_CREATE]":"2020-01-01T00:00:01+01:00" } print(params) response = requests.post(url_param, data = params) result = response.json() total = result['total'] print(total)
Пример полноценной выгрузки данных из Bitrix24 API в Excel с помощью библиотек Requests & Pandas
# Импортируем библиотеку requests import requests import pandas as pd import datetime import xlsxwriter # Старт print(datetime.datetime.now()) # method method_name = "crm.deal.list" # Адрес api метода для запроса get url_param = "https://crm.domain.ru/rest/1/oj98lLKHNldoij97tg/" + method_name # Путь для сохранения данных excel_path = "C:\\PythonETL\# Импортируем библиотеку requests import requests import pandas as pd import datetime import xlsxwriter # Старт print(datetime.datetime.now()) # method method_name = "crm.deal.list" # Адрес api метода для запроса get url_param = "https://crm.domain.ru/rest/1/oj98lLKHNldoij97tg/" + method_name # Путь для сохранения данных excel_path = "C:\\PythonETL\\0_ExtractData\\Bitrix24\\Excel\\crm.deal.list\\" params = { "filter[>=DATE_CREATE]":"2020-01-01 00:00:00" } response = requests.post(url_param, params) result = response.json() total_param = result['total'] result_data=[] print(total_param) for i in range (0,total_param,50): for attempt in range(10): try: # Задаем параметры для API param = { "start": str(i), "filter[>=DATE_CREATE]":"2020-01-01 00:00:00" } # Отправляем get request (запрос GET) response = requests.post(url_param,param) result = response.json() data = result['result'] result_data += data except: print("Ошибка при попытке " + str(attempt)) continue break print("Данные выгрузились, собираем df") dict_data = {} for j in range(0,len(result_data)): dict_data[j] = dict(result_data[j]) #Создаем DataFrame из dict (словаря данных или массива данных) dict_keys = dict_data[0].keys() df = pd.DataFrame.from_dict(dict_data, orient='index',columns=dict_keys) print("Выгружаем Excel") #Выгрузка данных из DataFrame в Excel df.to_excel(excel_path + method_name + "_2020" + ".xlsx", sheet_name='data', index=False, engine='xlsxwriter') # Конец print(datetime.datetime.now())_ExtractData\\Bitrix24\\Excel\\crm.deal.list\\" params = { "filter[>=DATE_CREATE]":"2020-01-01 00:00:00" } response = requests.post(url_param, params) result = response.json() total_param = result['total'] result_data=[] print(total_param) for i in range (0,total_param,50): for attempt in range(10): try: # Задаем параметры для API param = { "start": str(i), "filter[>=DATE_CREATE]":"2020-01-01 00:00:00" } # Отправляем get request (запрос GET) response = requests.post(url_param,param) result = response.json() data = result['result'] result_data += data except: print("Ошибка при попытке " + str(attempt)) continue break print("Данные выгрузились, собираем df") dict_data = {} for j in range(0,len(result_data)): dict_data[j] = dict(result_data[j]) #Создаем DataFrame из dict (словаря данных или массива данных) dict_keys = dict_data[0].keys() df = pd.DataFrame.from_dict(dict_data, orient='index',columns=dict_keys) print("Выгружаем Excel") #Выгрузка данных из DataFrame в Excel df.to_excel(excel_path + method_name + "_2020" + ".xlsx", sheet_name='data', index=False, engine='xlsxwriter') # Конец print(datetime.datetime.now())
3 Comments