/
zimaaadev
/
Parser
Обзор
Документация
Войти
/
zimaaadev
/
Parser
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
utils/http_client.py
62 строки
2 KB
zimaaadev
Ищет природные объекты, набнрежные и т.п.
24 дек 2025, 17:18
24 дек 2025, 17:18
2d73bc2
Код
Авторство
О чём код?
import httpx import asyncio import random import logging from typing import Dict, Optional from settings import PROXIES # импортируем настройки (прокси, User-Agent и т.д.) logger = logging.getLogger(__name__) # Ограничитель одновременных запросов (3 параллельных запроса) SEMAPHORE = asyncio.Semaphore(3) def get_random_headers() -> Dict[str, str]: """Возвращает случайные заголовки с ротацией User-Agent.""" return { "User-Agent": random.choice(PROXIES["user_agents"]), "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "ru,en;q=0.9", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", } async def fetch_with_retry( client: httpx.AsyncClient, url: str, retries: int = 5, delay: float = 1.0, max_delay: float = 30.0, ) -> Optional[httpx.Response]: """ Асинхронный GET-запрос с экспоненциальным ретраем и обработкой 429. """ last_exc = None for attempt in range(retries): try: async with SEMAPHORE: response = await client.get(url) if response.status_code == 429: logger.warning(f"[429] Too Many Requests на URL: {url}. Повтор через {delay} с. (попытка {attempt + 1}/{retries})") await asyncio.sleep(delay) delay = min(delay * 2, max_delay) continue response.raise_for_status() logger.debug(f"✅ Успешно получен ответ: {url}") return response except (httpx.RequestError, httpx.TimeoutException) as e: last_exc = e logger.warning(f"❌ Ошибка при запросе к {url} (попытка {attempt + 1}/{retries}): {e}") await asyncio.sleep(delay) delay = min(delay * 2, max_delay) logger.error(f"💥 Не удалось получить данные после {retries} попыток: {last_exc}") return None