Перейти к основному содержимому

Конфигурация

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

Существует три способа изменения параметров конфигурации:

  • добавление файла crawlee.json в ваш проект
  • установка переменных окружения
  • использование класса Configuration

Вы можете комбинировать все эти способы, но важно помнить о следующем порядке приоритета: crawlee.json < параметры конструктора < переменные окружения.

crawlee.json является базовым уровнем. Параметры, указанные в конструкторе Configuration, переопределяют параметры из JSON. Переменные окружения переопределяют оба варианта.

crawlee.json

Первый способ настройки Crawlee - это использование файла crawlee.json. Всё, что вам нужно сделать - это указать ConfigurationOptions в файле, разместить его в корневой директории вашего проекта, и Crawlee будет использовать предоставленные параметры как глобальную конфигурацию.

crawlee.json
{
"persistStateIntervalMillis": 10000,
"logLevel": "DEBUG"
}

При использовании crawlee.json вам не нужно делать что-либо дополнительно в коде:

import { CheerioCrawler, sleep } from 'crawlee';
// Мы не импортируем и не передаем
// Configuration в краулер.
// Также не устанавливаем переменные окружения
const crawler = new CheerioCrawler();

crawler.router.addDefaultHandler(async ({ request }) => {
// для первого запроса ждем 5 секунд,
// и добавляем второй запрос в очередь
if (request.url === 'https://www.example.com/1') {
await sleep(5_000);
await crawler.addRequests(['https://www.example.com/2'])
}
// для второго запроса ждем 10 секунд,
// и прерываем выполнение
if (request.url === 'https://www.example.com/2') {
await sleep(10_000);
process.exit(0);
}
});

await crawler.run(['https://www.example.com/1']);

Если вы запустите этот пример (предполагая, что вы разместили файл crawlee.json с указанными параметрами persistStateIntervalMillis и logLevel в корневой директории вашего проекта), вы найдете файл SDK_CRAWLER_STATISTICS в хранилище ключ-значение по умолчанию, который покажет, что есть 1 завершенный запрос и время работы краулера составило ~10 секунд. Это подтверждает, что состояние было сохранено после 10 секунд, как указано в crawlee.json. Кроме того, вы должны увидеть логи уровня DEBUG в дополнение к логам уровня INFO в вашем терминале, так как logLevel был установлен на DEBUG в crawlee.json, что означает, что Crawlee корректно применил оба предоставленных параметра.

Переменные окружения

Переменные окружения - это еще один способ настройки Crawlee. Ниже приведен список доступных переменных окружения.

Важные переменные окружения

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

CRAWLEE_STORAGE_DIR

Определяет путь к локальной директории, где KeyValueStore, Dataset и RequestQueue хранят свои данные. По умолчанию установлено значение ./storage.

CRAWLEE_DEFAULT_DATASET_ID

ID набора данных по умолчанию - default. Установка этой переменной окружения позволяет заменить ID набора данных по умолчанию на указанное значение.

CRAWLEE_DEFAULT_KEY_VALUE_STORE_ID

ID хранилища ключ-значение по умолчанию - default. Эта переменная позволяет установить другой ID.

CRAWLEE_DEFAULT_REQUEST_QUEUE_ID

ID очереди запросов по умолчанию - default. Можно изменить с помощью этой переменной.

CRAWLEE_PURGE_ON_START

По умолчанию директории хранения очищаются при запуске. Если установить значение false, локальные директории не будут автоматически очищаться при запуске краулера или при явном открытии хранилища (например, через Dataset.open()). Полезно, если нужно добавлять новые элементы в набор данных с каждым следующим запуском, сохраняя предыдущие данные.

Вспомогательные переменные окружения

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

CRAWLEE_HEADLESS

При установке значения 1 браузеры, запускаемые Crawlee, будут работать в безголовом режиме. Это значение можно переопределить в коде, например, передав опцию headless: true в функцию launchPuppeteer(). По умолчанию браузеры запускаются в режиме с интерфейсом.

CRAWLEE_LOG_LEVEL

Определяет минимальный уровень логирования. Возможные значения (в порядке возрастания важности): DEBUG, INFO, WARNING, ERROR и OFF. По умолчанию установлен уровень INFO, что означает, что сообщения уровня DEBUG не выводятся в консоль. Подробнее см. пространство имен utils.log.

CRAWLEE_VERBOSE_LOG

Включает подробное логирование при установке значения true. Если явно не установлено в true, для ошибок, возникающих внутри обработчика запросов, будет записано только предупреждение с сообщением об ошибке, если известно, что запрос будет повторен. То же самое относится к некоторым известным ошибкам (например, ошибкам тайм-аута). По умолчанию отключено.

CRAWLEE_MEMORY_MBYTES

Устанавливает объем системной памяти в мегабайтах для использования AutoscaledPool. Используется для ограничения количества одновременно выполняющихся задач. По умолчанию максимальный объем используемой памяти установлен на четверть от общей системной памяти. Например, в системе с 8192 МБ памяти функция автомасштабирования будет использовать не более 2048 МБ.

Configuration class

The last option to adjust Crawlee configuration is to use the Configuration class in the code.

Global Configuration

By default, there is a global singleton instance of Configuration class, it is used by the crawlers and some other classes that depend on a configurable behavior. In most cases you don't need to adjust any options there, but if needed - you can get access to it via Configuration.getGlobalConfig() function. Now you can easily get and set the ConfigurationOptions.

import { CheerioCrawler, Configuration, sleep } from 'crawlee';

// Получаем глобальную конфигурацию
const config = Configuration.getGlobalConfig();
// Устанавливаем параметр 'persistStateIntervalMillis'
// глобальной конфигурации на 10 секунд
config.set('persistStateIntervalMillis', 10_000);

// Обратите внимание, что мы не передаем конфигурацию краулеру,
// так как он использует глобальную конфигурацию
const crawler = new CheerioCrawler();

crawler.router.addDefaultHandler(async ({ request }) => {
// Для первого запроса ждем 5 секунд,
// и добавляем второй запрос в очередь
if (request.url === 'https://www.example.com/1') {
await sleep(5_000);
await crawler.addRequests(['https://www.example.com/2'])
}
// Для второго запроса ждем 10 секунд,
// и завершаем выполнение
if (request.url === 'https://www.example.com/2') {
await sleep(10_000);
process.exit(0);
}
});

await crawler.run(['https://www.example.com/1']);

Это практически тот же пример, который мы использовали для демонстрации использования crawlee.json, но теперь мы используем глобальную конфигурацию - в этом единственное отличие. Если вы запустите этот пример, вы найдете файл SDK_CRAWLER_STATISTICS в хранилище ключ-значение по умолчанию, как и раньше, который покажет то же количество завершенных запросов (один) и то же время работы краулера (~10 секунд). Это подтверждает, что предоставленные параметры сработали: состояние было сохранено через 10 секунд, как было установлено в глобальной конфигурации.

примечание

После запуска того же примера с закомментированными двумя строками кода, относящимися к Configuration, файл SDK_CRAWLER_STATISTICS не будет сохранен в хранилище ключ-значение по умолчанию: поскольку мы не изменяли persistStateIntervalMillis, Crawlee использовал значение по умолчанию в 60 секунд, и краулер был принудительно остановлен примерно через 15 секунд работы, до того как он успел сохранить состояние в первый раз.

Пользовательская конфигурация

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

import { CheerioCrawler, Configuration, sleep } from 'crawlee';

// Создаем новую конфигурацию
const config = new Configuration({
// Устанавливаем параметр 'persistStateIntervalMillis' на 10 секунд
persistStateIntervalMillis: 10_000,
});

// Теперь нужно передать конфигурацию краулеру
const crawler = new CheerioCrawler({}, config);

crawler.router.addDefaultHandler(async ({ request }) => {
// Для первого запроса ждем 5 секунд,
// и добавляем второй запрос в очередь
if (request.url === 'https://www.example.com/1') {
await sleep(5_000);
await crawler.addRequests(['https://www.example.com/2'])
}
// Для второго запроса ждем 10 секунд,
// и завершаем выполнение
if (request.url === 'https://www.example.com/2') {
await sleep(10_000);
process.exit(0);
}
});

await crawler.run(['https://www.example.com/1']);

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

примечание

Если не передать конфигурацию краулеру, файл SDK_CRAWLER_STATISTICS снова не будет сохранен в хранилище ключ-значение по умолчанию, но уже по другой причине. Поскольку мы не передали конфигурацию краулеру, он будет использовать глобальную конфигурацию, которая использует значение persistStateIntervalMillis по умолчанию. Таким образом, выполнение снова будет прервано до того, как состояние будет сохранено в первый раз.