Конфигурация
Configuration
- это класс, содержащий параметры конфигурации Crawlee. По умолчанию вам не нужно устанавливать или изменять какие-либо из них, но в определенных случаях это может потребоваться, например, чтобы изменить каталог хранения по умолчанию или включить подробное логирование ошибок.
Существует три способа изменения параметров конфигурации:
- добавление файла
crawlee.json
в ваш проект - установка переменных окружения
- использование класса
Configuration
Вы можете комбинировать все эти способы, но важно помнить о следующем порядке приоритета:
crawlee.json
< параметры конструктора < переменные окружения.
crawlee.json
является базовым уровнем. Параметры, указанные в конструкторе Configuration
, переопределяют параметры из JSON. Переменные окружения переопределяют оба варианта.
crawlee.json
Первый способ настройки Crawlee - это использование файла crawlee.json
. Всё, что вам нужно сделать - это указать ConfigurationOptions
в файле, разместить его в корневой директории вашего проекта, и Crawlee будет использовать предоставленные параметры как глобальную конфигурацию.
{
"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
по умолчанию. Таким образом, выполнение снова будет прервано до того, как состояние будет сохранено в первый раз.