HTTP Adapter



HTTPAdapter представляет собой компонент библиотеки requests, который обеспечивает удобное управление конфигурацией соединения с внешним сервером. Облегчает работу в сетевых приложениях, к примеру, можно полноценно управлять пулом соединений и инициировать повторные попытки запросов.

# Создание адаптера с пользовательской конфигурацией

adapter = HTTPAdapter(
    pool_connections=10,         # Количество соединений в пуле
    pool_maxsize=20,             # Максимальное количество соединений в пуле
    max_retries=5,               # Стратегия повторных попыток
    pool_block=True              # Блокировать или нет, когда пул соединений полон
)

Параметры конструктора

pool_connections. Указывает на максимальное количество пулов соединений к хостам. Для наглядности это можно представить как количество парковок в разных местах, к которым предоставляется доступ.

pool_maxsize. Максимальное количество соединений, которое может быть установлено в рамках одного пула. Если ранее пул соединений был представлен в виде отдельных парковок, то данный параметр можно визуализировать как количество мест на такой парковке. Если все места заняты, то необходимо ожидать, пока освободиться место (новое соединение).

pool_block. Логический параметр, True означает, что если все соединения в пуле заняты, новые запросы будут ожидать, пока не освободиться место. В противном случае сразу генерируется ошибка.

max_retries. Максимальное количество попыток при возникновении проблем с подключением. К примеру, если возникли проблемы с сетью, запросы на подключение будут поступать, пока указанный лимит не исчерпается.

Пример использования:

import requests
from requests.adapters import HTTPAdapter

# Создаем сессию
session = requests.Session()

# Создаем адаптер с конфигурацией по умолчанию
adapter = HTTPAdapter(pool_connections=10, pool_maxsize=20)

# Монтируем адаптер для HTTP и HTTPS
session.mount('http://', adapter)
session.mount('https://', adapter)

# Теперь можно делать запросы через эту сессию
response = session.get('https://httpbin.org/get')
print(response.status_code)  # 200

session = requests.Session() – данная строка создает новый объект сессии, который обеспечивает HTTP-запросы с указанной конфигурацией.

adapter = HTTPAdapter(pool_connections=10, pool_maxsize=20) – создание адаптера. Создается объект HTTPAdapter с нужным набором параметров для управления пулом соединений.

session.mount(‘http://’, adapter) и session.mount(‘https://’, adapter) – монтирование созданного адаптера к HTTP и HTTPS протоколам. Такая реализация означает, что настройки будут применяться к каждому запросу, независимо от используемого протокола.

Часто возникает ситуация, когда для парсинга используется обширный список прокси-серверов, при этом нет гарантии их качества. Для загрузки большого массива данных это может стать серьезной проблемой.

HTTPAdapter позволяет настроить сессию таким образом, чтобы запускать автоматическое переключение на другой прокси, если с текущим возникли проблемы. Это позволяет обеспечить устойчивость к временным сбоям в сети. Пример реализации:

import requests
from requests.adapters import HTTPAdapter

# Список прокси
proxies_list = [
    {"http": "http://10.10.1.11:3128", "https": "socks5://10.10.10.11:3128"},
    {"http": "socks5://10.10.10.159:8000", "https": "socks5://10.10.10.159:8000"},
        #...
    {"http": "socks5://10.10.10.216:8000", "https": "socks5://10.10.10.216:8000"},
]

# Создание сессии
session = requests.Session()
def make_request(proxy):
    adapter = HTTPAdapter()
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    try:
        response = session.get('https://httpbin.org/get', proxies=proxy, timeout=5)
        print(f'Успех с прокси {proxy}: {response.status_code}')
    except requests.exceptions.RequestException as e:
        print(f'Не удалось использовать прокси {proxy}: {str(e)}')
        return False   # Возврат False при неудачной попытке
    return True        # Возврат True при успешной попытке

# Перебор прокси и запросов
proxy_index = 0
for i in range(5):
    success = make_request(proxies_list[proxy_index])
    if not success:
        proxy_index = (proxy_index + 1) % len(proxies_list)       # Переход к следующему прокси
        success = make_request(proxies_list[proxy_index])         # Повторный запрос с новым прокси
# Закрытие сессии
session.close()

В данном коде функция make_request делает попытку отправки запроса через текущий прокси. Если запрос неуспешен, инициируется автоматическое переключение на следующий в списке прокси. Данный процесс продолжается, пока запрос не завершится успехом или будут проверены все прокси в загруженном списке.

Такой подход позволяет автоматизировать процесс проверки прокси на работоспособность, повышая при этом отказоустойчивость приложения.



Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: