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

Хранение результатов

Crawlee предлагает несколько типов хранилищ данных для различных задач. Данные сохраняются локально в директорию, указанную в переменной окружения CRAWLEE_STORAGE_DIR. Если эта переменная не задана, Crawlee по умолчанию использует директорию ./storage в текущей рабочей папке.

Хранилище Crawlee управляется классом MemoryStorage. Во время работы краулера вся информация хранится в памяти и параллельно выгружается в локальные файлы в соответствующих папках хранилища.

Хранилище ключ-значение

Хранилище ключ-значение используется для сохранения и чтения записей данных или файлов. Каждая запись представлена уникальным ключом и связанным MIME-типом содержимого. Такие хранилища идеально подходят для сохранения скриншотов веб-страниц, PDF-файлов или состояния краулеров.

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

В Crawlee хранилище ключ-значение представлено классом KeyValueStore. Для упрощения доступа к хранилищу по умолчанию предоставляются методы KeyValueStore.getValue() и KeyValueStore.setValue().

Данные сохраняются в директории, указанной в переменной CRAWLEE_STORAGE_DIR, по следующему пути:

{CRAWLEE_STORAGE_DIR}/key_value_stores/{STORE_ID}/{KEY}.{EXT}
примечание

{STORE_ID} - это имя или ID хранилища. У хранилища по умолчанию ID default, если не переопределен через переменную окружения CRAWLEE_DEFAULT_KEY_VALUE_STORE_ID. {KEY} - ключ записи, а {EXT} соответствует MIME-типу данных.

Пример базовых операций с хранилищем:

import { KeyValueStore } from 'crawlee';

// Получение INPUT из хранилища по умолчанию
const input = await KeyValueStore.getInput();

// Запись OUTPUT в хранилище по умолчанию
await KeyValueStore.setValue('OUTPUT', { myResult: 123 });

// Открытие именованного хранилища
const store = await KeyValueStore.open('some-name');

// Запись в именованное хранилище.
// JavaScript-объекты автоматически конвертируются в JSON,
// строки и бинарные буферы сохраняются как есть
await store.setValue('some-key', { foo: 'bar' });

// Чтение из именованного хранилища.
// JSON автоматически парсится в JavaScript-объект,
// текст возвращается строкой, остальные данные - бинарным буфером
const value = await store.getValue('some-key');

// Удаление записи из именованного хранилища
await store.setValue('some-key', null);

Практический пример работы с входными данными можно найти в примере Скриншоты.

Наборы данных

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

Каждый проект Crawlee имеет набор данных по умолчанию. Обычно он используется для хранения результатов конкретного запуска краулера. Его использование необязательно.

В Crawlee набор данных представлен классом Dataset. Для упрощения записи в набор по умолчанию предоставляется метод Dataset.pushData().

Данные сохраняются в директории, указанной в переменной CRAWLEE_STORAGE_DIR, по следующему пути:

{CRAWLEE_STORAGE_DIR}/datasets/{DATASET_ID}/{INDEX}.json
примечание

{DATASET_ID} - это имя или ID набора данных. У набора по умолчанию ID default, если не переопределен через переменную окружения CRAWLEE_DEFAULT_DATASET_ID. Каждый элемент сохраняется в отдельном JSON-файле, где {INDEX} - это индекс элемента в наборе, начиная с нуля.

Пример базовых операций с набором данных:

import { Dataset } from 'crawlee';

// Запись одной строки в набор по умолчанию
await Dataset.pushData({ col1: 123, col2: 'val2' });

// Открытие именованного набора
const dataset = await Dataset.open('some-name');

// Запись одной строки
await dataset.pushData({ foo: 'bar' });

// Запись нескольких строк
await dataset.pushData([{ foo: 'bar2', col2: 'val2' }, { col3: 123 }]);

Пример использования набора данных для хранения результатов можно найти в примере Cheerio Crawler.

Очистка хранилищ

Хранилища по умолчанию очищаются перед запуском краулера, если не указано иное. Это происходит при первом обращении к хранилищу (например, через Dataset.open()) или при использовании вспомогательных методов (например, Dataset.pushData()). Если мы не работаем с хранилищами явно, очистка произойдет при выполнении метода run краулера. Если нужно очистить хранилища раньше, можно использовать helper purgeDefaultStorages():

import { purgeDefaultStorages } from 'crawlee';

await purgeDefaultStorages();

Этот метод очистит директории хранилищ по умолчанию, кроме ключа INPUT в хранилище ключ-значение. Это сокращение для выполнения (опционального) метода purge интерфейса StorageClient. Метод гарантирует, что очистка произойдет только один раз для данного контекста выполнения.