Методы 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 заголовков на каждой странице:
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
для получения общего количества заголовков (всех элементов в датасете):
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