Как перестать воевать с Cloudflare и начать кормить LLM чистыми данными

06 мар 2026
559
41
1 месяц

Знакомая история: вы строите крутого AI-агента, которому нужно ходить в интернет за свежей информацией. Вы открываете документацию Puppeteer или Playwright, пишете скрипт, и всё вроде бы работает. До первой серьезной защиты. Потом начинаются костыли: поиск стелс-плагинов, попытки подделать TLS-отпечатки, борьба с бесконечными капчами и настройка прокси. В итоге вместо логики агента вы три дня отлаживаете инфраструктуру браузера, которая всё равно падает в продакшене.

Недавно я наткнулся на проект Reader от команды vakra-dev. Ребята решили собрать все боли веб-скрейпинга в один инструмент, заточенный под выдачу контента для языковых моделей.

Reader Logo

Что это такое и зачем оно нам

Reader — это движок для скрейпинга и краулинга, который превращает любую страницу в чистый Markdown. Основная фишка здесь не в самой конвертации HTML (хотя и она сделана добротно), а в том, что скрыто под капотом. Проект базируется на Ulixee Hero — это такой безголовый браузер, который умеет притворяться обычным пользователем настолько хорошо, что даже Cloudflare и Turnstile часто не замечают подвоха.

Если вы пробовали парсить современные сайты обычным fetch или простым axios, то знаете, что на выходе получается гора мусора: меню, футеры, рекламные баннеры и куча JS-скриптов. Для обучения модели или работы RAG-системы это информационный шум, который только тратит токены. Reader забирает на себя всю грязную работу по очистке.

Реклама

Как это работает в коде

Работа с библиотекой сводится к двум основным действиям: scrape (забрать конкретные страницы) и crawl (пройтись по ссылкам и собрать сайт целиком).

Вот самый простой пример, как достать контент:

import { ReaderClient } from "@vakra-dev/reader";

const reader = new ReaderClient();

// Скармливаем URL — получаем чистый Markdown
const result = await reader.scrape({ urls: ["https://habr.com/ru/articles/123456/"] });
console.log(result.data[0].markdown);

В консоли вы увидите не месиво из тегов, а структурированный текст, готовый к отправке в GPT-4 или Claude.

Что интересного внутри

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

Умная очистка контента через Rust

Разработчики Reader написали собственную библиотеку supermarkdown на Rust. Она вырезает навигацию, шапки и подвалы сайтов, оставляя только суть статьи. Благодаря Rust это происходит быстро, что критично, если вы парсите сотни страниц за раз.

Обход защит без головной боли

Проблема Puppeteer в том, что у него очень "палевный" TLS-отпечаток. Сайты сразу видят, что к ним ломится скрипт. Reader через Ulixee Hero имитирует честный браузер: маскирует WebRTC, подменяет DNS-запросы и правильно выставляет сигналы в DOM. Это позволяет проходить проверки, на которых валятся стандартные инструменты.

Управление пулом браузеров

Если запустить 50 экземпляров Chrome одновременно, сервер просто "умрет" от нехватки памяти. В Reader встроен механизм BrowserPool. Он сам следит за здоровьем инстансов, перезапускает их после определенного количества страниц или времени работы и управляет очередью запросов.

Reader demo

Практические кейсы

Для чего это можно использовать прямо сейчас:

  1. База знаний для RAG: если вам нужно быстро скормить своей локальной LLM документацию какой-нибудь новой библиотеки или серию статей из блога.
  2. Мониторинг конкурентов: можно настроить краулер, который раз в день будет пробегать по списку сайтов, собирать изменения и присылать вам краткую выжимку через AI.
  3. Автоматизация контента: сбор данных из разных источников для создания аналитических отчетов без ручного копипаста.

Кому стоит попробовать

Проект точно пригодится тем, кто пишет на Node.js и строит инфраструктуру вокруг LLM. Если вам нужно просто собрать данные с одного-двух открытых сайтов, возможно, это избыточно — хватит и простого парсера. Но если ваша задача — стабильный сбор данных с защищенных ресурсов в промышленных масштабах, Reader сэкономит вам недели разработки.

Из минусов: проект требует установки системных зависимостей Chromium в Linux (библиотеки вроде libnss3, libatk и прочие), так как внутри крутится настоящий браузер. Это стандартная плата за возможность обходить антифрод-системы.

В целом, это отличный пример того, как узкоспециализированный инструмент решает конкретную проблему «грязных» данных для искусственного интеллекта. Посмотреть исходники и документацию можно в репозитории vakra-dev/reader.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.