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

Методы map и reduce для Dataset

В этом примере показано простое использование методов Dataset map и reduce. Оба метода можно использовать для упрощения обработки результатов датасета. Их можно вызывать непосредственно на объекте dataset.

Важно отметить, что оба метода возвращают новый результат (map возвращает новый массив, а reduce может возвращать любой тип) - ни один из методов не изменяет сам датасет.

Примеры обоих методов показаны на простом датасете, содержащем результаты парсинга страницы: URL и гипотетическое количество заголовков h1 - h3 в ключе headingCount.

Эта структура данных хранится в датасете по умолчанию в {PROJECT_FOLDER}/storage/datasets/default/. Если вы хотите повторить функциональность, вы можете использовать метод dataset.pushData() для сохранения примера массива JSON в ваш датасет.

[
{
"url": "https://crawlee.dev/",
"headingCount": 11
},
{
"url": "https://crawlee.dev/storage",
"headingCount": 8
},
{
"url": "https://crawlee.dev/proxy",
"headingCount": 4
}
]

Map

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

Метод map используется для проверки наличия более 5 заголовков на каждой странице:

Run on
import { Dataset, KeyValueStore } from 'crawlee';

const dataset = await Dataset.open<{
url: string;
headingCount: number;
}>();

// Заполнение датасета начальными данными
await dataset.pushData([
{
url: 'https://crawlee.dev/',
headingCount: 11,
},
{
url: 'https://crawlee.dev/storage',
headingCount: 8,
},
{
url: 'https://crawlee.dev/proxy',
headingCount: 4,
},
]);

// Вызов функции map и фильтрация через обработанные элементы...
const moreThan5headers = (await dataset.map((item) => item.headingCount)).filter((count) => count > 5);

// Сохранение результата map в хранилище ключ-значение по умолчанию...
await KeyValueStore.setValue('pages_with_more_than_5_headers', moreThan5headers);

Переменная moreThan5headers представляет собой массив атрибутов headingCount, где количество заголовков больше 5.

Результат метода map, сохраненный в key-value store, должен быть:

[11, 8]

Reduce

Метод reduce датасета не создает новый массив значений - он сводит список значений к одному значению. Метод перебирает элементы в датасете, используя аргумент memo. После выполнения необходимых вычислений memo передается в следующую итерацию, а обработанный элемент сокращается (удаляется).

Использование метода reduce для получения общего количества заголовков (всех элементов в датасете):

Run on
import { Dataset, KeyValueStore } from 'crawlee';

const dataset = await Dataset.open<{
url: string;
headingCount: number;
}>();

// Заполнение датасета начальными данными
await dataset.pushData([
{
url: 'https://crawlee.dev/',
headingCount: 11,
},
{
url: 'https://crawlee.dev/storage',
headingCount: 8,
},
{
url: 'https://crawlee.dev/proxy',
headingCount: 4,
},
]);

// вызов функции reduce и использование memo для вычисления количества заголовков
const pagesHeadingCount = await dataset.reduce((memo, value) => {
return memo + value.headingCount;
}, 0);

// сохранение результата map в хранилище ключ-значение по умолчанию
await KeyValueStore.setValue('pages_heading_count', pagesHeadingCount);

Исходный датасет будет сведен к одному значению pagesHeadingCount, которое содержит количество всех заголовков для всех обработанных страниц (всех элементов датасета).

Результат метода reduce, сохраненный в key-value store, должен быть:

23