Содержание
  1. Продуктовая поверхность и границы сравнения
  2. Матрица решений: требования против выбора
  3. Учебный вход, маршрут и ручной контракт
  4. Свойства источников и статус учебного примера
  5. Отрицательные случаи и неизвестные значения
  6. Чужие числа и отказ от универсального победителя
  7. Как принять решение после учебного пилота
  8. Частые вопросы
Подборки и сравнения

Firecrawl или Crawl4AI: выбор сборщика

7 ноября 2026 · 20 минут чтения

Firecrawl или Crawl4AI: выбор сборщика решается по трём условиям: где лежит источник, готовы ли вы отдать его внешнему API и есть ли у команды собственная браузерная среда. Managed Firecrawl подходит для публичного URL. Crawl4AI живёт на вашем железе и работает с закрытыми HTTP-ресурсами. Ниже — матрица, учебный вход и контракт приёмки.

Продуктовая поверхность и границы сравнения

Документация Firecrawl описывает /scrape как endpoint, который превращает URL в чистый Markdown или структурированные данные, включая страницы с тяжёлым JavaScript и динамические приложения. Проект берёт на себя прокси, кэширование, лимиты запросов и контент, закрытый JS. На выходе доступны markdown, структурированные данные, скриншоты и html. Тот же документ перечисляет форматы: markdown, summary, html, rawHtml, rawBase64, screenshot, links, json, images, branding, product, audio, video, query. Формат rawBase64 возвращает исходное тело HTTP-ответа в Base64 и требует одиночного запроса: API отклоняет его в компании с любым другим форматом. Поле содержит голую Base64-строку, MIME-тип читается из metadata.contentType, а в ответе нет ни markdown, ни html, ни rawHtml.

Документация Crawl4AI описывает проект как открытый LLM-ориентированный веб-краулер и скрапер. Ядро — асинхронный AsyncWebCrawler, настройки браузера и запуска идут через BrowserConfig и CrawlerRunConfig. Автоматическое преобразование HTML в Markdown выполняет DefaultMarkdownGenerator с опциональными фильтрами. Стратегии извлечения делятся на LLM-ориентированные и традиционные на CSS или XPath. Минимальный скрипт создаёт AsyncWebCrawler, забирает страницу и печатает первые 300 символов Markdown. Под капотом запускается headless-браузер, по умолчанию Chromium.

Границы сравнения задаются самими продуктами. Managed Firecrawl — сетевой сервис: ему нужен URL, доступный извне. Локальный адрес file:// или localhost вашей машины в managed-режиме не подходит. Crawl4AI запускается в вашей среде и умеет принимать сырой HTML через префикс raw:// вместо URL. Документация Crawl4AI приводит пример, где в arun передаётся url="raw://" + raw_html. Это разные поверхности: одна работает с публичным адресом, вторая — с локальным содержимым.

Self-host Firecrawl существует как отдельная история. Документация Firecrawl упоминает self-hosting в связи с форматом product: этот формат опирается на выделенный сервис извлечения товаров, в Firecrawl Cloud он работает из коробки, а при самостоятельном размещении нужно задать PRODUCT_EXTRACTION_SERVICE_URL. Пока переменная не задана, запрос формата product возвращает предупреждение и пустой товар. Свойства self-host не переносятся автоматически на managed-поверхность, и наоборот.

Ограничение сравнения по объёму: этот материал разбирает обычный Markdown одного доступного HTTP-источника. Специализированный формат product извлекает один товар с вариантами и не равен произвольному списку карточек. JSON-извлечение с LLM и детерминированная CSS-схема Crawl4AI различаются по механизму, и смешивать их в одном тесте нельзя.

Свежесть результата следует проверять отдельно. В документации Firecrawl параметр maxAge: 0 задаёт обход кэша. Для повторной обработки изменённого учебного файла читатель явно задаёт этот режим и сохраняет полученный ответ.

Crawl4AI решает вопрос свежести иначе. Документация проекта указывает, что по умолчанию режим кэша выставлен в CacheMode.BYPASS ради свежего контента, а CacheMode.ENABLED включает кэширование. Это значит, что одинаковый учебный вход нужно прогонять с осознанным выбором режима: у Firecrawl свежесть включается через maxAge, у Crawl4AI — через режим кэша.

Обе поверхности возвращают статусы, и статусы стоит различать. Документация Firecrawl делит их на два слоя. Статус API-запроса — это HTTP-код вызова Firecrawl вместе с булевым success в теле: принятый и обработанный запрос возвращает 200 и success: true даже тогда, когда целевая страница отдала не-2xx. Статус страницы лежит в data.metadata.statusCode и показывает, что вернул сам сайт: 200, 301, 404, 403, 500. Надёжный порядок проверки: сначала убедиться, что запрос прошёл (200 и success: true), затем посмотреть data.metadata.statusCode. Firecrawl считает чистым 2xx или 304, всё остальное означает, что страница загрузилась не чисто. При ошибочном статусе страницы data.metadata.error может нести дополнительные детали.

Crawl4AI отдаёт результат объекта с полем success и error_message при неудаче. В примерах документации проверка выглядит как if result.success: с печатью Markdown и веткой else с result.error_message. Тот же принцип: успешный вызов и содержательный результат — разные вещи.

Матрица решений: требования против выбора

Матрица ниже заполнена по условиям читателя. Она помогает выбрать следующий пилот по конкретным условиям.

Условие читателя Что пилотировать Почему так
Источник публичный, его можно отдать внешнему API, своей браузерной среды нет Managed Firecrawl Сервис берёт на себя прокси, кэш, лимиты и JS-контент
Источник закрытый HTTP-ресурс, допустим только собственный браузер, команда умеет его поддерживать Crawl4AI Библиотека работает в вашей среде, headless-браузер поднимается локально
Нужен доступ к защищённому чужому сайту без разрешения Ни один из двух Требуется разрешение владельца
Нужно полностью локальное LLM-извлечение Сборщик плюс отдельная проверка модели Выбор сборщика не решает вопрос провайдера и сетевых вызовов

Условие пересмотра для первых двух строк — изменение политики размещения источника или потеря смысла страницы в одинаковом тесте. Если публикация учебного файла стала недопустимой, общий удалённый пилот не выполнен. Локальный тест Crawl4AI в такой ситуации не объявляется сравнением двух запусков.

Разберём строки подробнее. Публичный источник и готовность отдать его внешнему API — это два независимых требования. Первое отвечает на вопрос доступности адреса, второе — на вопрос политики. Источник может быть публичным, а политика команды запрещать передачу содержимого третьей стороне. Тогда managed-вариант отпадает по организационной причине, и остаётся локальная среда.

Закрытый HTTP-ресурс и умение поддерживать браузер — тоже два требования. Библиотека в вашей среде требует, чтобы кто-то обновлял зависимости, следил за версией браузера и разбирался с падениями. Если такого человека нет, локальный путь превращается в постоянную нагрузку.

Третья строка матрицы фиксирует границу, которую инструменты не двигают. Доступ к защищённому чужому сайту без разрешения остаётся вопросом прав, и ни managed-сервис, ни локальная библиотека его не решают. Четвёртая строка разделяет две задачи: сбор страницы и извлечение структуры моделью. Выбор сборщика отвечает только за первую.

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

Учебный вход, маршрут и ручной контракт

Учебный вход — небольшой несекретный HTML-файл. Он содержит навигацию, заголовок, таблицу с рабочими окнами двух регионов, оговорку об отсутствии поддержки в выходные и футер.

HTML8 строк
<!doctype html><meta charset="utf-8">
<nav>Site navigation</nav>
<main><h1>Service windows</h1>
<table><tr><th>Region</th><th>Hours</th></tr>
<tr><td>EU</td><td>09:00–17:00</td></tr>
<tr><td>APAC</td><td>01:00–09:00</td></tr></table>
<p>No weekend support.</p></main>
<footer>Contact</footer>

Маршрут сравнения состоит из шагов, которые выполняет владелец файла.

  1. Разместить этот несекретный файл по публичному HTTPS-адресу, который разрешён владельцу и доступен обоим продуктам.
  2. Проверить открытие страницы извне, до всяких вызовов.
  3. Передать один и тот же адрес в Firecrawl scrape с выводом Markdown.
  4. Передать тот же адрес в AsyncWebCrawler Crawl4AI с raw Markdown.
  5. Для Crawl4AI сохранить raw и fit отдельно, если включён фильтр.
  6. Применить контракт приёмки к каждому использованному варианту вывода.

Шаг с публикацией выполняет владелец источника. Никакую учебную страницу не публикуют автоматически, и размещение файла в интернете остаётся решением того, кто им владеет. Если публикация недопустима, общий удалённый пилот не выполняется.

Ручной эталон для приёмки: заголовок Service windows; строка EU со значением 09:00–17:00; строка APAC со значением 01:00–09:00; оговорка No weekend support. Точное Markdown-оформление таблицы не задано: результат принимается по сохранённому содержанию. Наличие футера или навигации само по себе не означает провала. Ошибкой считается потеря или перестановка рабочих интервалов либо пропажа оговорки.

Контракт приёмки формулируется до запуска, чтобы результат не подгонялся под него задним числом. Четыре пункта эталона проверяются отдельно, и каждый даёт свой вердикт. Такой контракт переносится на любой похожий источник: заголовок, две пары значений, одна оговорка.

Запуск Firecrawl в учебном маршруте опирается на документированный вызов. Документация показывает Python-вариант с Firecrawl() и методом scrape с параметром formats=["markdown", "html"], а также cURL-вызов на https://api.firecrawl.dev/v2/scrape с телом, где указаны url и formats. Ключ API в примерах не обязателен для старта: комментарий в документации говорит, что ключ добавляют ради повышенных лимитов. Для учебного маршрута это значит, что вызов можно собрать по документации, а ключ подставить из переменной окружения.

Запуск Crawl4AI в том же маршруте опирается на AsyncWebCrawler и CrawlerRunConfig. Документация приводит минимальный скрипт с arun и печатью result.markdown[:300], а также вариант с BrowserConfig(headless=True) и CrawlerRunConfig(cache_mode=CacheMode.BYPASS). Для свежего результата на учебном входе режим обхода кэша выставляется явно.

Разница в выводе Markdown описана в документации Crawl4AI. result.markdown — прямое преобразование HTML в Markdown. result.markdown.fit_markdown — тот же контент после применённого фильтра, например PruningContentFilterLXML. Если фильтр или генератор не задан, обычно виден только raw Markdown. Для учебного контракта это означает: raw и fit проверяются как два разных результата, и контракт применяется к каждому.

Сохранение raw и fit отдельно — практический шаг. Фильтр может вырезать блок, который в эталоне значим. Тогда raw покажет полную картину, а fit объяснит, что именно отброшено. Без раздельного сохранения спор о причине провала превращается в догадки.

Свойства источников и статус учебного примера

Фактические свойства источников стоит держать отдельно от учебного примера. Документация Firecrawl описывает форматы вывода, кэш, статусы, действия на странице, локацию и язык, пакетный сбор, режим Zero Data Retention. Документация Crawl4AI описывает асинхронный краулер, конфигурацию браузера и запуска, генерацию Markdown, фильтры контента, CSS- и LLM-стратегии извлечения, адаптивный обход и параллельную работу с несколькими URL.

Учебный пример из предыдущего раздела — условный вход. Он не является измерением редакции и не доказывает лимиты продукта. Интервалы 09:00–17:00 и 01:00–09:00 заданы в учебном эталоне. Их извлечение редакцией не выполнялось. Отрицательные образцы результата тоже условны: они показывают, как выглядит провал по контракту, и не являются испорченными живыми страницами.

Разведём слои явно.

Слой Что в нём Как относиться
Документированные свойства Форматы, параметры, статусы, кэш, режимы Проверяемо по первичной документации
Учебный вход HTML-файл с таблицей и оговоркой Условный пример читателя
Ручной эталон Четыре пункта приёмки Контракт, заданный до запуска
Отрицательные образцы Перестановка, пропажа, подмена Иллюстрация провала

Документация Firecrawl описывает формат product как детерминированное извлечение одного товара: заголовок, бренд, категория, описание и варианты, где каждый вариант несёт цену, исходную цену, наличие и изображения. Извлечение идёт из структурированных данных на странице без вызова LLM, с приоритетом источников: JSON-LD, микроразметка schema.org, RDFa, встроенное состояние, затем OpenGraph и метатеги. Извлечение работает по принципу fail-closed: при неоднозначном источнике извлечение возвращает предупреждение и результат без товара, а слабые источники вроде OpenGraph участвуют только при наличии цены. На странице без извлекаемого товара ответ не содержит объект product и добавляет предупреждение.

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

Документация Crawl4AI описывает CSS-схему как детерминированный путь. Пример схемы содержит name, baseSelector и список fields с селекторами и типами. Результат извлечения лежит в extracted_content и разбирается через json.loads. Документация отдельно отмечает пользу подхода для повторяющихся структур вроде списков товаров и статей, отсутствие затрат на ИИ и возврат JSON-строки для разбора или хранения.

Документация Crawl4AI также описывает генерацию схемы через LLM как разовую операцию: JsonCssExtractionStrategy.generate_schema принимает HTML и LLMConfig с провайдером и токеном. Для OpenAI токен обязателен, для Ollama он не нужен. Полученная схема затем используется для быстрых повторных извлечений без LLM. Это разовая стоимость, отдельная от самого сбора страницы.

Свойства источников не складываются в рейтинг. Документация Firecrawl подробно описывает форматы и кэш, документация Crawl4AI — фильтры и стратегии. Оба набора описывают свои продукты, и переносить числа одного на другой нельзя.

Отрицательные случаи и неизвестные значения

Отрицательные образцы результата проверяются по контракту приёмки. Ни один из них не измерен редакцией: это условные примеры плохого вывода.

Первый образец: строка EU получила значение 01:00–09:00, строка APAC — значение 09:00–17:00. Это провал по двум соответствиям сразу: обе пары переставлены.

Второй образец: тот же текст, но без оговорки No weekend support. Это провал по ограничению: значимая часть эталона потеряна.

Третий образец: HTTP-код 200, а вместо заголовка Service windows на странице форма входа. Это провал по содержанию: успешный ответ не равен нужному содержимому.

Третий образец связан с двухслойной проверкой статусов у Firecrawl. Успешный API-ответ сам по себе не доказывает чистую загрузку страницы и содержательную полноту. Порядок проверки из документации — сначала 200 и success: true, затем data.metadata.statusCode — прямо отвечает на этот случай. Если страница отдала не-2xx, data.metadata.error может нести детали.

У Crawl4AI аналогичную роль играет проверка result.success и error_message. Успешный вызов без нужного содержимого остаётся провалом по контракту.

Отдельно стоит вопрос свежести. maxAge управляет тем, может ли Firecrawl вернуть кэшированную копию, и не сообщает, актуально ли состояние, которое представляет страница. Документация прямо говорит: когда свежесть важна, ставят maxAge: 0, обходят кэш и затем изучают возвращённый контент и любые сигналы редиректа или статуса. Успешный ответ сам по себе не доказывает актуальность состояния.

У Crawl4AI свежесть задаётся режимом кэша. Документация указывает CacheMode.BYPASS как значение по умолчанию ради свежего контента и CacheMode.ENABLED для включения кэширования. Для повторного прогона учебного входа после правки файла режим обхода кэша выставляется явно.

Неизвестные значения тоже часть честной картины. Точное Markdown-оформление таблицы не задано: контракт принимает содержание, и разметка может отличаться. Наличие футера или навигации в выводе само по себе не означает провала. Ошибкой остаётся потеря или перестановка рабочих интервалов либо пропажа оговорки.

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

Ещё один отрицательный случай — недопустимая публикация. Если размещение учебного файла по публичному адресу недопустимо, общий удалённый пилот не выполнен. Локальный тест Crawl4AI в этом случае не объявляется сравнением двух запусков: сравнивать нечего.

Чужие числа и отказ от универсального победителя

Чужие числа в этот разбор не переносятся. Обзоры сторонних площадок приводят собственные замеры и собственные условия, и их значения относятся к их стендам. Например, обзор Bright Data на своей странице описывает проверку на собственном наборе и приводит собственные времена. Эти значения остаются его данными и в контракт приёмки не входят.

Тезис о том, что любая реальная структурированная выборка в Crawl4AI требует LLM, противоречит текущей документации проекта: CSS-схема описана как детерминированный путь без затрат на ИИ. Этот тезис в разборе не повторяется.

Затраты на пилот оцените отдельно по фактически выбранному маршруту. Для managed-сервиса проверьте текущие условия аккаунта перед запуском. Для своей среды учитывайте инфраструктуру и её сопровождение. Дополнительные модельные вызовы относятся к отдельной части обработки, если они используются.

В этой процедуре стоимость и скорость не измерялись. Выбор по матрице подтверждает совместимость требований и даёт план проверки содержимого.

Фильтрация Markdown проверяется по сохранению смысла на том же входе. Быстродействие конкретной реализации здесь не измерено и не используется как основание выбора.

Универсального победителя в разборе нет. Матрица решений даёт разные ответы для разных условий читателя. Публичный источник с готовностью отдать его внешнему API ведёт к пилоту managed Firecrawl. Закрытый HTTP-ресурс с собственной браузерной средой и командой, которая её поддерживает, ведёт к пилоту Crawl4AI. Третья строка матрицы не выбирает продукт: она фиксирует ограничение прав. Четвёртая добавляет отдельную проверку модели и сетевых вызовов.

Готовый промпт для разбора результата — вспомогательный инструмент, когда нужно сравнить вывод двух сборщиков по одному контракту.

ТЕКСТ20 строк
Ты помогаешь принять результат сбора веб-страницы по контракту приёмки.

Вход:
1) Эталон (задан до запуска):
   - Заголовок: Service windows
   - EU: 09:00–17:00
   - APAC: 01:00–09:00
   - Оговорка: No weekend support
2) Результат сборщика в Markdown: [вставьте вывод Firecrawl или Crawl4AI]

Проверь по пунктам и верни таблицу:
| Пункт эталона | Найдено в результате | Вердикт PASS/FAIL | Комментарий |

Правила:
- Точное оформление таблицы в Markdown не важно, важен смысл.
- Наличие футера или навигации само по себе не провал.
- Провал: потеря или перестановка рабочих интервалов, пропажа оговорки.
- Если результат пуст или содержит форму входа вместо заголовка — FAIL по содержанию.
- Не додумывай данные, которых нет в результате.
- В конце дай одну строку: итог PASS или FAIL и краткую причину.

Что менять под себя: заголовок, пары значений и оговорку в блоке эталона; при другом источнике замените четыре пункта на свои. Если сравниваете два сборщика, прогоните промпт дважды с одинаковым эталоном и разными результатами.

Вариации той же задачи:

  1. Промпт для сравнения raw и fit Markdown у Crawl4AI: добавьте в вход оба варианта и попросите показать, какие блоки эталона пропали в fit.
  2. Промпт для проверки свежести: добавьте дату публикации страницы и попросите отметить расхождение с ожидаемой.
  3. Промпт для списка адресов: замените один результат на список и попросите свести вердикты в одну таблицу по адресам.
  4. Промпт для проверки статусов Firecrawl: добавьте success, HTTP-код запроса и data.metadata.statusCode и попросите объяснить расхождение.
  5. Промпт для разбора ошибки Crawl4AI: добавьте success и error_message и попросите отделить сетевую ошибку от провала по контракту.

Как принять решение после учебного пилота

Заполните карточку решения отдельно от сохранённых результатов. В ней нужны исходное требование, выбранная среда, фактически использованный адрес, варианты Markdown и причина итогового выбора. Формулировка должна позволять другому человеку повторить именно вашу проверку. Запись «получился хороший Markdown» оставляет открытыми и условия доступа, и содержание результата. Полезная запись перечисляет найденные пары регионов и интервалов, сохранённую оговорку и замеченные потери. Весь вывод сборщика остаётся приложением к такой карточке.

Сначала проверьте соответствие требований выбранной строке матрицы. В учебном публичном сценарии владелец разрешил размещение файла и его обработку внешним сервисом. Если теперь используется закрытая рабочая страница, это уже другое условие. Успех на публичном макете нельзя переносить на закрытый ресурс. Зафиксируйте изменение и вернитесь к выбору среды. Аналогично появление собственной браузерной инфраструктуры меняет исходные возможности команды, но само по себе ничего не говорит о качестве Markdown.

Затем откройте исходный HTML рядом с каждым результатом. Для региона EU найдите целиком его рабочий интервал и убедитесь, что рядом осталась именно метка EU. Повторите ту же операцию для APAC. Простое наличие всех временных значений не закрывает проверку: ошибочный вывод с переставленными строками содержит каждое из них. Укажите в карточке, где видна принадлежность значения региону. Это может быть строка таблицы, маркированный элемент или ясная фраза. Конкретная пунктуация значения не заменяет его смысла.

Оговорку No weekend support проверяйте самостоятельным пунктом. Она относится к обслуживанию и ограничивает прочтение рабочих окон. Если интервал сохранился, а оговорка исчезла, такой материал нельзя передавать дальше как полный источник. Отдельно отметьте место оговорки в результате. Если она оказалась далеко от таблицы, оцените, сможет ли следующий этап обработки связать их. Ручная карточка должна сохранять эту связь, иначе следующая система может получить лишь удобный фрагмент с расписанием.

Для Crawl4AI выполните такую проверку для каждого фактически используемого варианта. Если raw проходит контракт, а fit теряет оговорку, приёмка относится только к raw. Из этого следует конкретное решение о передаваемом файле. Читатель сохраняет полную версию или корректирует фильтр и повторяет проверку. Наличие более короткого текста не делает его автоматически пригодным. Если raw и fit одинаковы по смыслу, зафиксируйте совпадение; искусственно добиваться разницы ради демонстрации фильтра не требуется.

Сопоставьте наблюдение со статусами запроса. Сетевая ошибка требует отдельного разбора доставки. Полученная форма входа показывает несоответствие содержимого ожидаемой странице. Переставленные интервалы показывают ошибку представления данных. Эти случаи требуют разных следующих действий, поэтому общий вердикт «не работает» слишком груб. Сохраните исходный ответ до повторной попытки. Иначе станет трудно установить, изменился ли источник, настройка или сам ответ. Повторный результат тоже проходит весь исходный контракт.

При расхождении двух продуктов принимайте решение в пределах макета. Запись «в этой конфигурации сохранились обе пары и оговорка» описывает наблюдение. Она ещё не подтверждает полноту обхода сайта, пригодность для иной таблицы или поведение под нагрузкой. Для следующего источника подготовьте собственный эталон с его значимыми ограничениями. Если читатель такого запуска не выполнял, карточка должна остаться планом пилота. Учебный пример этой статьи именно задаёт план и не содержит измеренных ответов продуктов.

Наконец, назначьте основание пересмотра выбранного пути. Для публичного сценария им может стать изменение политики передачи данных. Для собственной среды — отсутствие человека, который поддерживает её зависимости и браузер. Для обоих путей основанием служит потеря обязательного смысла источника. Такой критерий позволяет вернуться к решению после изменения условий. Он полезнее общего предпочтения бренда: команда понимает, какое наблюдение требует нового пилота и какой прежний результат по-прежнему относится только к сохранённой версии учебной страницы.

Частые вопросы

Firecrawl или Crawl4AI: что выбрать для публичного сайта без своей инфраструктуры?

При публичном источнике, готовности отдать его внешнему API и отсутствии собственной браузерной среды матрица ведёт к пилоту managed Firecrawl. Сервис берёт на себя прокси, кэш, лимиты и JS-контент. Ключ API не обязателен для старта, его добавляют ради повышенных лимитов. Решение проверяется на учебном входе по контракту приёмки.

Можно ли направить managed Firecrawl на localhost или file://?

Managed-сервису нужен URL, доступный ему извне. Локальный адрес вашей машины в managed-режиме не подходит. Для локального содержимого Crawl4AI принимает сырой HTML через префикс raw:// вместо URL. Если публикация учебного файла недопустима, общий удалённый пилот не выполняется.

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

У Firecrawl два слоя статусов: HTTP-код запроса с success: true и статус страницы в data.metadata.statusCode. Принятый запрос возвращает 200 и success: true даже при не-2xx у целевой страницы. Порядок проверки: сначала успех запроса, затем статус страницы. У Crawl4AI аналогичную роль играют success и error_message.

Как обойти кэш при повторном прогоне учебного входа?

У Firecrawl кэш по умолчанию живёт с окном maxAge = 172800000 мс, то есть двое суток. Для принудительно свежего запроса ставят maxAge: 0, что обходит кэш целиком. У Crawl4AI по умолчанию выставлен CacheMode.BYPASS, а CacheMode.ENABLED включает кэширование. Кэшированный ответ Firecrawl стоит те же 1 кредит на страницу.

Чем формат product отличается от обычного Markdown?

Формат product извлекает один товар с вариантами детерминированно, без вызова LLM, из структурированных данных страницы. Он возвращает заголовок, бренд, категорию, описание и варианты с ценой, наличием и изображениями. Произвольный список карточек этот формат не покрывает. Для учебного входа с таблицей рабочих окон он не применяется.

Читайте также

3 материала