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 делает попытку отправки запроса через текущий прокси. Если запрос неуспешен, инициируется автоматическое переключение на следующий в списке прокси. Данный процесс продолжается, пока запрос не завершится успехом или будут проверены все прокси в загруженном списке.
Такой подход позволяет автоматизировать процесс проверки прокси на работоспособность, повышая при этом отказоустойчивость приложения.