Об этом проекте

web-core представляет собой пакет общей веб-инфраструктуры для Python, который обеспечивает работу MCP-сервера wet-mcp и других зависимых приложений. Он объединяет несколько веб-возможностей за типизированным публичным API. В README отмечается, что селекторы для конкретных сайтов намеренно оставлены на усмотрение приложений-потребителей — сам пакет предоставляет только общую инфраструктуру, а куки и селекторы для каждого домена передаются через переменные окружения. Возможности, перечисленные в README: - Поиск SearXNG: кросс-процессный синглтон-раннер (на базе file-lock, обеспечивающий один экземпляр во всех процессах Python), а также клиент, выполняющий повторные попытки, дедупликацию результатов и фильтрацию доменов. - Многостратегический скрапинг: агент на базе машины состояний LangGraph, который переключается между стратегиями при эскалации. Входящие модули стратегий включают: прямой запрос к API, базовый HTTP, спуфинг TLS-отпечатков через curl-cffi, headless-рендеринг через Crawl4AI, рендеринг в скрытом браузере Patchright, удаленный рендеринг через RenderClient и стратегию обхода CAPTCHA на базе CapSolver. Стратегии пробуются в порядке, рекомендованном кэшем, ответы проходят валидацию, а сбои приводят к автоматической эскалации (например, переход от недорендеренных JS-оболочек к бэкенду рендеринга). StrategyCache отслеживает производительность по доменам. - SSRF-безопасный HTTP-клиент: клиент httpx с привязкой DNS (DNS-pinned), нормализацией URL, удалением параметров отслеживания и помощниками для валидации доменов. Весь исходящий HTTP-трафик должен проходить через safe_httpx_client для защиты от DNS-rebinding. - Браузеры и удаленный рендеринг: протокол BrowserProvider, провайдер Patchright (undetected Playwright), BrowserlessClient для самохостинг-эндпоинтов /content и клиент Cloudflare Browser Rendering, предназначенные для легких контейнеров, выносящих рендеринг JavaScript вовне. - Соблюдение robots.txt: кэшируемая проверка для каждого домена перед выполнением запроса. - Вывод селекторов с помощью LLM (опционально): при сбое встроенных селекторов провайдер может быть определен автоматически на основе имеющегося API-ключа (Google Gemini, OpenAI, Anthropic, xAI); если ключ не задан, вывод пропускается. Также может быть внедрен пользовательский llm_caller. Gemini может быть маршрутизирована через Vertex AI с помощью переменных проекта/локации. - Адаптеры внешних API: типизированные, SSRF-безопасные клиенты для получения папок/файлов Google Drive и данных MangaDex (манга, главы, изображения). Установка осуществляется из PyPI как n24q02m-web-core (uv add), доступна стабильная ветка v2.x. Конфигурация полностью управляется переменными окружения, и каждая переменная является опциональной — отсутствие переменной отключает соответствующую функцию, и для импорта или использования пакета не требуется никаких обязательных переменных. Документированные переменные включают URL SearXNG и пользователя запуска, куки по доменам (JSON) для скрапинга, а также ключи LLM-провайдеров и переопределение модели для вывода селекторов. Учетные данные удаленного рендеринга передаются как аргументы конструктора. Архитектура организована в src/web_core с многослойными модулями: http (SSRF-безопасные примитивы, утилиты URL), search (клиент, модели, раннер), scraper (агент, базовая стратегия, кэш, robots, вывод селекторов, состояние, утилиты и подпакет стратегий), browsers (протокол, patchright, browserless, cf_rendering) и adapters (google_drive, mangadex). Пакет поставляется с маркером py.typed для типизации PEP 561. Ключевые проектные решения включают привязку DNS для защиты от SSRF, автоматическую эскалацию стратегий, кросс-процессный синглтон SearXNG и использование структурной типизации на базе Protocol, чтобы реализации браузеров и рендеринга не нуждались в наследовании от базового класса. Разработка ориентирована на Python 3.13 с использованием uv, опциональных ярлыков задач mise, pre-commit хуков, ruff для линтинга/форматирования, ty для проверки типов и pytest с покрытием — тестовый набор требует порога покрытия 95% и использует asyncio_mode auto. Тестовые файлы зеркально отражают структуру исходных модулей. Проект лицензирован под Apache-2.0.