Dataset의 Map과 Reduce 메서드
이 예제에서는 Dataset
의 map
과
reduce
메서드의 간단한 사용 사례를 보여줍니다. 두 메서드 모두 데이터셋 결과를 처리하는 과정을 단순화하는 데 사용할 수 있으며, dataset에서 직접 호출할 수 있습니다.
주목할 점은 두 메서드 모두 새로운 결과를 반환한다는 것입니다(map
은 새로운 배열을 반환하고 reduce
는 어떤 타입이든 반환할 수 있음). 두 메서드 모두 데이터셋을 직접 수정하지 않습니다.
아래 예제에서는 웹 페이지에서 스크래핑한 결과를 포함하는 간단한 데이터셋을 사용합니다: URL
과 headingCount
키 아래에 있는 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
메서드:
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
메서드 사용:
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