Содержание страницы

В этом уроке по 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 — это набор протоколов, предназначенных для обеспечения связи между клиентами и серверами. Он работает как протокол запроса-ответа между клиентом и сервером.

Веб-браузер может быть клиентом, а приложение на компьютере, на котором размещен веб-сайт, может быть сервером.

Итак, чтобы запросить ответ у сервера, в основном используют два метода:

  1. GET: запросить данные с сервера. Т.е. мы отправляем только URL (HTTP) запрос без данных. Метод HTTP GET предназначен для получения информации от сервера. В рамках GET-запроса некоторые данные могут быть переданы в строке запроса URI в формате параметров (например, условия поиска, диапазоны дат, ID Объекта, номер счетчика и т.д.).
  2. 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&param2=-234&param3=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

Коды состояния возвращаются при каждом запросе к веб-серверу. Коды состояния указывают информацию о том, что произошло с запросом. 

Ответы сгруппированы в пять классов:

  1. Информационные ответы ( 100— 199),
  2. Успешные ответы ( 200— 299),
  3. Перенаправления ( 300— 399),
  4. Ошибки клиента ( 400— 499),
  5. и ошибки сервера ( 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\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())
5 1 голос
Рейтинг статьи
Шамаев Иван

от Шамаев Иван

Разработчик аналитических решений QlikView/Qlik Sense/Power BI; Python Data Scientist; Разработчик интеграционных решений на PHP, Python, JavaScript.

Подписаться
Уведомить о
guest
1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Николай
Николай
2 месяцев назад

Иван, подскажите пожалуйста новичку, как скачать данные в DataFrame с сайта cbr.ru. import requests import pandas as pd url = https://www.cbr.ru/statistics/pffl/?UniDbQuery.Posted=True&UniDbQuery.DT=11.03.2014 df = pd.read_html(url, index_col=0) dfs = df[0] dfs # Получаем такую таблицу: 1 0 Изменение объема наличных денег в обращении (вне Банка России) 27 Изменение остатков средств на счетах расширенного правительства в Банке России и прочие операции** -23 Регулирование Банком России обязательных резервов кредитных организаций 0 Сальдо операций Банка России по предоставлению/абсорбированию ликвидности со сроками исполнения, приходящимися на указанный период -2 225 Лимит по рыночным операциям Банка России по предоставлению ликвидности на срок 1 неделя с датой проведения 11.03.2014… Подробнее »

1
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x
Открыть диалог
Нужна помощь?