본문으로 건너뛰기

Dataset의 Map과 Reduce 메서드

이 예제에서는 Datasetmapreduce 메서드의 간단한 사용 사례를 보여줍니다. 두 메서드 모두 데이터셋 결과를 처리하는 과정을 단순화하는 데 사용할 수 있으며, dataset에서 직접 호출할 수 있습니다.

주목할 점은 두 메서드 모두 새로운 결과를 반환한다는 것입니다(map은 새로운 배열을 반환하고 reduce는 어떤 타입이든 반환할 수 있음). 두 메서드 모두 데이터셋을 직접 수정하지 않습니다.

아래 예제에서는 웹 페이지에서 스크래핑한 결과를 포함하는 간단한 데이터셋을 사용합니다: URLheadingCount 키 아래에 있는 h1 - h3 헤더 요소의 가상 개수입니다.

이 데이터 구조는 {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 메서드는 일반적인 Array의 map 메서드와 매우 유사합니다. 기존 배열의 각 값을 변환 함수를 통해 처리하여 새로운 값의 배열을 생성합니다.

각 페이지에 헤더 요소가 5개 이상 있는지 확인하는 데 사용되는 map 메서드:

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 결과를 기본 key-value store에 저장...
await KeyValueStore.setValue('pages_with_more_than_5_headers', moreThan5headers);

moreThan5headers 변수는 헤더 수가 5개보다 큰 headingCount 속성들의 배열입니다.

key-value store에 저장된 map 메서드의 결과값은 다음과 같습니다:

[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 결과를 기본 key-value 저장소에 저장
await KeyValueStore.setValue('pages_heading_count', pagesHeadingCount);

원본 데이터셋은 스크래핑된 모든 페이지의 헤더 개수 합계를 포함하는 단일 값인 pagesHeadingCount로 줄어듭니다.

key-value store에 저장된 reduce 메서드의 결과값은 다음과 같습니다:

23