INTEGRITY Документация

/crawl - Сканирование веб-контента

/crawl эндпоинт собирает содержимое, начиная с заданного URL, и переходит по ссылкам в пределах сайта до настраиваемой глубины или лимита страниц. Ответы можно получать в формате HTML, Markdown или JSON.

/crawl эндпоинт доступен через REST API. Создайте пользовательский API Token на Browser Rendering - Edit разрешение.

Конечная точка

https://api.cloudflare.com/client/v4/accounts/<account_id>/browser-rendering/crawl

Обязательные поля

См. необязательные параметры для дополнительных параметров настройки.

Типичные варианты использования

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

Есть два шага для использования /crawl конечная точка:

  1. Запустите задачу сканирования : POST запрос, которым вы инициируете обход и получаете ответ с идентификатором id.
  2. Запросите результаты задания сканирования : GET запрос, которым вы запрашиваете статус или результаты обхода.

Максимальное время выполнения задания сканирования составляет семь дней. Если за это время задание не завершается, оно отменяется по тайм-ауту. Результаты задания доступны в течение 14 дней после его завершения, после чего данные задания удаляются.

Запустите задачу сканирования

Отправьте POST запрос с url чтобы запустить задание сканирования. API сразу же возвращает id который вы будете использовать для получения результатов. Подробнее см. необязательные параметры для дополнительных параметров настройки.

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://developers.cloudflare.com/workers/"
  }'

Пример ответа:

{
	"success": true,
	"result": "c7f8s2d9-a8e7-4b6e-8e4d-3d4a1b2c3f4e"
}

Запросите результаты задания сканирования

Чтобы проверить статус или запросить результаты задания на сканирование, используйте job id который вы получили:

curl -X GET 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl/c7f8s2d9-a8e7-4b6e-8e4d-3d4a1b2c3f4e' \
  -H 'Authorization: Bearer YOUR_API_TOKEN'

Ответ включает status указывающее текущее состояние задачи обхода. Возможные статусы задачи:

Опрос до завершения

Так как задачи сканирования выполняются асинхронно, вы можете периодически опрашивать эндпоинт, чтобы узнать, когда задача завершится. Добавьте ?limit=1 к URL-адресу запроса, чтобы ответ оставался лёгким. Вам нужен только status, а не весь набор собранных записей.

async function waitForCrawl(accountId, jobId, apiToken) {
	const maxAttempts = 60;
	const delayMs = 5000;

	for (let i = 0; i < maxAttempts; i++) {
		const response = await fetch(
			`https://api.cloudflare.com/client/v4/accounts/${accountId}/browser-rendering/crawl/${jobId}?limit=1`,
			{
				headers: {
					Authorization: `Bearer ${apiToken}`,
				},
			},
		);

		const data = await response.json();
		const status = data.result.status;

		if (status !== "running") {
			return data.result;
		}

		await new Promise((resolve) => setTimeout(resolve, delayMs));
	}

	throw new Error("Crawl job did not complete within timeout");
}

Как только задание достигнет финального статуса, получите полные результаты без limit параметр. Вы также можете использовать следующие параметры запроса, чтобы фильтровать результаты и разбивать их на страницы:

Пример с параметрами запроса:

curl -X GET 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl/c7f8s2d9-a8e7-4b6e-8e4d-3d4a1b2c3f4e?cursor=10&limit=10&status=completed' \
  -H 'Authorization: Bearer YOUR_API_TOKEN'

Пример ответа:

{
	"result": {
		"id": "c7f8s2d9-a8e7-4b6e-8e4d-3d4a1b2c3f4e",
		"status": "completed",
		"browserSecondsUsed": 134.7,
		"total": 50,
		"finished": 50,
		"records": [
			{
				"url": "https://developers.cloudflare.com/workers/",
				"status": "completed",
				"markdown": "# Cloudflare Workers\nBuild and deploy serverless applications...",
				"metadata": {
					"status": 200,
					"title": "Cloudflare Workers · Cloudflare Workers docs",
					"url": "https://developers.cloudflare.com/workers/"
				}
			},
			{
				"url": "https://developers.cloudflare.com/workers/get-started/quickstarts/",
				"status": "completed",
				"markdown": "## Quickstarts\nGet up and running with a simple Hello World...",
				"metadata": {
					"status": 200,
					"title": "Quickstarts · Cloudflare Workers docs",
					"url": "https://developers.cloudflare.com/workers/get-started/quickstarts/"
				}
			}
			// ... 48 more entries omitted for brevity
		],
		"cursor": 10
	},
	"success": true
}

Страницы с ошибками и заблокированные страницы

Если просканированная страница возвращает ошибку HTTP (например, 402, 403, или 500), запись для этого URL-адреса будет иметь "status": "errored".

Эта информация доступна только в результатах сканирования (шаг 2): ответ на инициацию возвращает только идентификатор id. Поскольку задания обхода выполняются асинхронно, краулер не загружает содержимое страницы в момент инициации.

Чтобы просмотреть только записи с ошибками, отфильтруйте по status=errored:

curl -X GET 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl/{job_id}?status=errored' \
  -H 'Authorization: Bearer YOUR_API_TOKEN'

У записи status содержит код состояния HTTP, возвращённый исходным сервером, а html содержит тело ответа. Это полезно для понимания намерений владельцев сайтов при блокировке краулеров, например у сайтов, использующих AI Crawl Control ↗ может возвращать собственный код статуса и сообщение.

Отмена задания краулинга

Чтобы отменить выполняющееся задание на сканирование, используйте job id который вы получили:

curl -X DELETE 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl/c7f8s2d9-a8e7-4b6e-8e4d-3d4a1b2c3f4e' \
  -H 'Authorization: Bearer YOUR_API_TOKEN'

При успешной отмене возвращается 200 OK код состояния. Статус задания изменится на cancelled, а все URL-адреса, поставленные в очередь на сканирование, будут отменены.

Необязательные параметры

Следующие необязательные параметры можно использовать в запросе на сканирование в дополнение к обязательному url параметр. Это параметры, специфичные для /crawl конечная точка.

Когда render это true (значение по умолчанию), задания сканирования также поддерживают все стандартные параметры Browser Run, например rejectResourceTypes, rejectRequestPattern, cookies, а также setExtraHTTPHeaders. Когда render это false, поддерживаются только специфичные для обхода параметры, перечисленные в таблице ниже. Полный список см. в Справочник по API.

Необязательный параметр Тип Описание
limit Число Максимальное количество страниц для сканирования (по умолчанию 10, максимум 100,000).
depth Число Максимальная глубина ссылок для сканирования от начального URL (по умолчанию 100,000, максимум 100,000).
source String Источник для обнаружения URL. Доступные варианты: all, sitemaps, или links. По умолчанию all.
formats Массив строк Формат ответа (по умолчанию HTML, также доступны Markdown и JSON). Формат JSON использует Workers AI по умолчанию для извлечения данных, что учитывается в использовании Workers AI. См. /json конечная точка чтобы узнать больше, в том числе о том, как использовать пользовательскую модель и запасные варианты.
render Boolean Если задано false, выполняется быстрая загрузка HTML без выполнения JavaScript (по умолчанию true, подробнее о render).
jsonOptions Объект Требуется только если formats включает json. Содержит prompt, response_format, а также custom_ai свойства (те же типы, что и у /json конечная точка).
maxAge Число Максимальное время в секундах, в течение которого краулер может использовать кэшированный ресурс, прежде чем повторно запросить его с исходного сервера (по умолчанию 86,400, максимум 604,800). Кэш отдается из R2, только если URL и параметры полностью совпадают.
modifiedSince Число Unix-время (в секундах), указывающее, что сканировать нужно только страницы, изменённые после этого момента.
options.includeExternalLinks Boolean Если задано true, выполняется переход по ссылкам на внешние домены (по умолчанию false).
options.includeSubdomains Boolean Если задано true, выполняется переход по ссылкам на поддомены начального URL (по умолчанию false).
options.includePatterns Массив строк Посещает только URL-адреса, соответствующие одному из этих шаблонов с подстановочными знаками. Используйте * чтобы соответствовать любым символам, кроме /, или ** чтобы соответствовать любым символам, включая /.
options.excludePatterns Массив строк Не переходит по URL-адресам, соответствующим любому из этих шаблонов с подстановочными знаками. Используйте * чтобы соответствовать любым символам, кроме /, или ** чтобы соответствовать любым символам, включая /.
crawlPurposes Массив строк Определяет предполагаемое использование просканированного контента для Content Signals ↗ применения. Допустимые значения: search, ai-input, ai-train. По умолчанию ["search", "ai-input", "ai-train"]. Если у целевого сайта robots.txt включает Content-Signal директиву, устанавливающую любое из заявленных вами назначений в значение no, запрос на обход будет отклонён с 400 ошибку. См. Content Signals для получения подробностей.

Поведение шаблона

excludePatterns имеет строго более высокий приоритет. Если URL соответствует правилу исключения, он пропускается независимо от того, соответствует ли он правилу включения.

Просмотр пропущенных URL

skipped присваивается URL-адресам, которые краулер обнаружил и оценил по отдельности, но решил не загружать, поскольку они были исключены вашей конфигурацией сканирования, например includeExternalLinks, includeSubdomains, или includePatterns/excludePatterns. Чтобы просмотреть эти URL-адреса, запросите результаты задания сканирования с помощью status=skipped.

curl -X GET 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl/{job_id}?status=skipped' \
  -H 'Authorization: Bearer YOUR_API_TOKEN'

Поскольку skipped отслеживает только URL-адреса, которые оценивались по одному, поэтому это применимо в основном к обходам, использующим source: links (или source: all), при котором краулер переходит по ссылкам, собранным со страниц, и проверяет каждую из них на соответствие вашей конфигурации. При обходе по sitemap (source: sitemaps), URL-адреса, не соответствующие вашей конфигурации, отфильтровываются массово до индивидуальной оценки, поэтому они полностью исключаются из задания, а не фиксируются как skipped. В результате набор skipped URL-адресов не является исчерпывающим списком всех URL-адресов, исключённых из сканирования.

render параметр

Если вы используете render: true, используемого по умолчанию, crawl эндпоинт запускает headless-браузер и выполняет JavaScript страницы. Если вы используете render: false, crawl эндпоинт выполняет быстрый запрос HTML без выполнения JavaScript.

Используйте render: true когда страница формирует контент в браузере. Используйте render: false когда нужный контент уже присутствует в исходном HTML-ответе.

Сканирования, использующие render: true используют headless-браузер и оплачиваются по стандартным тарифам Browser Run. Сканирования, использующие render: false выполняется на Workers вместо headless-браузера. Во время бета-тестирования render: false обходы не тарифицируются. После завершения бета-версии они будут тарифицироваться в рамках Тарифы Workers.

Пример со всеми необязательными параметрами

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://www.exampledocs.com/docs/",
    "crawlPurposes": ["search"],
    "limit": 50,
    "depth": 2,
    "formats": ["markdown"],
    "render": false,
    "maxAge": 7200,
    "modifiedSince": 1704067200,
    "source": "all",
    "options": {
      "includeExternalLinks": true,
      "includeSubdomains": true,
      "includePatterns": [
        "**/api/v1/*"
      ],
      "excludePatterns": [
        "*/learning-paths/*"
      ]
    }
}'

Расширенное использование

Сканирование сайта документации

Сканируйте только страницы документации, исключив отдельные разделы:

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://example.com/docs",
    "limit": 200,
    "depth": 5,
    "formats": ["markdown"],
    "options": {
      "includePatterns": [
        "https://example.com/docs/**"
      ],
      "excludePatterns": [
        "https://example.com/docs/changelog/**",
        "https://example.com/docs/archive/**"
      ]
    }
  }'

Извлечение каталога товаров с помощью ИИ

Извлечение структурированных данных о товаре с помощью json формате. Для этого используется Workers AI по умолчанию. См. /json конечная точка чтобы узнать больше.

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://shop.example.com/products",
    "limit": 50,
    "formats": ["json"],
    "jsonOptions": {
      "prompt": "Extract product name, price, description, and availability",
      "response_format": {
        "type": "json_schema",
        "json_schema": {
          "name": "product",
          "properties": {
            "name": "string",
            "price": "number",
            "currency": "string",
            "description": "string",
            "inStock": "boolean"
          }
        }
      }
    },
    "options": {
      "includePatterns": [
        "https://shop.example.com/products/*"
      ]
    }
  }'

Быстрое получение статического контента

Получайте статический HTML без рендеринга для более быстрого обхода статических сайтов:

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://example.com",
    "limit": 100,
    "render": false,
    "formats": ["html", "markdown"]
  }'

Сканирование с аутентификацией

Сканируйте страницы, защищенные HTTP-аутентификацией, или с пользовательскими заголовками:

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://secure.example.com",
    "limit": 50,
    "authenticate": {
      "username": "user",
      "password": "pass"
    }
  }'

Для аутентификации по токену можно также использовать cookies или пользовательские заголовки:

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://api.example.com/docs",
    "limit": 100,
    "setExtraHTTPHeaders": {
      "X-API-Key": "your-api-key"
    }
  }'

Ожидание динамического контента

Сканируйте одностраничные приложения, загружающие контент динамически:

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://app.example.com",
    "limit": 50,
    "gotoOptions": {
      "waitUntil": "networkidle2",
      "timeout": 60000
    },
    "waitForSelector": {
      "selector": "[data-content-loaded]",
      "timeout": 30000,
      "visible": true
    }
  }'

Блокировка ненужных ресурсов

Ускорьте сканирование, блокируя изображения и медиафайлы. rejectResourceTypes доступен только если render это true (значение по умолчанию).

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://example.com",
    "limit": 100,
    "rejectResourceTypes": [
      "image",
      "media",
      "font",
      "stylesheet"
    ]
  }'

Поведение краулера

Как краулер обнаруживает URL-адреса

Краулер обнаруживает и обрабатывает URL в следующем порядке (при использовании source: all, по умолчанию):

  1. Начальный URL : URL-адрес, указанный в вашем запросе.
  2. Ссылки из Sitemap : URL-адреса, найденные в sitemap сайта.
  3. Ссылки на странице : Ссылки, собранные со страниц, если они ещё не найдены в sitemap.

Используйте source параметр, чтобы настроить, какие источники использует краулер. Доступные варианты:

robots.txt и защита от ботов

/crawl эндпоинт учитывает директивы robots.txt файлы, включая crawl-delay. Если сайт не указывает crawl-delay в своём robots.txt, краулер использует задержку по умолчанию 0,5 секунды между запросами к одному и тому же домену, чтобы не перегружать исходный сервер. Все URL-адреса, которые /crawl запрещено обходить, перечислены в ответе с "status": "disallowed". Инструкции по настройке robots.txt и карты сайта (sitemaps) для ресурсов, которые вы планируете сканировать, см. robots.txt и карты сайта. Если вы хотите заблокировать /crawl эндпоинту доступ к вашему сайту, см. Блокировка краулеров с помощью robots.txt.

User-Agent

/crawl эндпоинт использует CloudflareBrowserRenderingCrawler/1.0 в качестве своего User-Agent, который отличается от других Быстрые действия эндпоинтов. Этот User-Agent нельзя настроить. В отличие от других эндпоинтов Quick Actions, userAgent параметр не поддерживается в /crawl конечная точка.

Полный список строк User-Agent по умолчанию см. в Автоматические заголовки запросов.

Content Signals

/crawl эндпоинт учитывает Content Signals ↗ директивы, найденные в файле целевого сайта robots.txt файл. Content Signals представляют собой способ, позволяющий владельцам сайтов указывать свои предпочтения относительно того, как их контент может использоваться автоматизированными системами. Дополнительные сведения см. в Новая политика Content Signals Policy Cloudflare даёт пользователям выбор ↗.

Владелец сайта может добавить Content-Signal директиву в своём robots.txt чтобы разрешить или запретить отдельные категории использования:

Например, robots.txt который разрешает индексирование поисковыми системами, но запрещает использование для обучения ИИ:

robots.txt
User-Agent: *
Content-Signal: search=yes, ai-train=no
Allow: /

Как /crawl обеспечивает соблюдение Content Signals

По умолчанию /crawl объявляет все три назначения: ["search", "ai-input", "ai-train"]. Если целевой сайт устанавливает любой из этих сигналов о содержимом в no, запрос на обход будет отклонён при инициации с 400 Bad Request ошибку, если вы явно не сузите заявленные назначения с помощью crawlPurposes параметр, чтобы исключить запрещённое использование.

Это означает:

  1. На сайте нет Content Signals : Обход выполняется в обычном режиме.
  2. На сайте есть Content Signals, и все заявленные вами цели разрешены : Обход выполняется в обычном режиме.
  3. Сайт устанавливает content signal со значением no, и это назначение указано в вашем crawlPurposes : Запрос на обход отклоняется с 400 ошибку и сообщение Crawl purpose(s) completely disallowed by Content-Signal directive.

Чтобы сканировать сайт, который запрещает использование данных для обучения ИИ, но разрешает поиск, укажите crawlPurposes только теми целями, которые вам нужны:

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://example.com",
    "crawlPurposes": ["search"],
    "formats": ["markdown"]
  }'

В этом примере, поскольку оператор объявил только search в качестве назначения, сканирование завершится успешно, даже если сайт устанавливает ai-train=no.

Устранение неполадок

Задание сканирования не возвращает результатов или все URL-адреса пропущены

Если задание сканирования завершается, но возвращает пустой массив records, или все URL-адреса показывают skipped или disallowed статус:

Сканирование отклонено Content Signals

Если запрос на сканирование возвращает 400 Bad Request с сообщением Crawl purpose(s) completely disallowed by Content-Signal directive, сайта назначения robots.txt включает Content-Signal директиву, запрещающую одно или несколько заявленных вами crawlPurposes. Чтобы устранить эту проблему, проверьте на сайте robots.txt для Content-Signal: записи и установите crawlPurposes только теми целями, которые вам нужны. Например, если сайт задаёт ai-train=no и вам нужна только индексация для поиска, используйте "crawlPurposes": ["search"]. См. Content Signals для получения подробностей.

Задание сканирования выполняется слишком долго

Если задание сканирования остаётся в статусе running статус в течение длительного времени:

Задание сканирования отменено из-за превышения лимитов

A cancelled_due_to_limits статус означает, что ваш аккаунт исчерпал лимит времени использования браузера. план Workers Free аккаунты ограничены 10 минутами использования браузера в день. Решение:

Ошибки извлечения JSON

Если json формате возвращает null или пустой результат:

Если у вас есть вопросы или возникли другие ошибки, см. Часто задаваемые вопросы и руководство по устранению неполадок Browser Run.

Устранение неполадок

Если у вас есть вопросы или возникла ошибка, см. Часто задаваемые вопросы и руководство по устранению неполадок Browser Run.