Cheerio 크롤러
이 예제는 CheerioCrawler
를 사용하여 외부 파일에서 URL 목록을 크롤링하는 방법을 보여줍니다. 일반 HTTP 요청을 사용하여 각 URL을 로드하고, Cheerio 라이브러리를 사용하여 HTML을 파싱한 다음 페이지 제목과 모든 h1
태그와 같은 데이터를 추출합니다.
Run on
import { CheerioCrawler, log, LogLevel } from 'crawlee';
// 크롤러에는 로깅과 같은 다양한 유틸리티가 포함되어 있습니다.
// 디버깅 경험을 향상시키기 위해 여기서는 디버그 수준의 로깅을 사용합니다.
// 이 기능은 선택사항입니다!
log.setLevel(LogLevel.DEBUG);
// CheerioCrawler 클래스의 인스턴스를 생성합니다.
// URL을 자동으로 로드하고 cheerio 라이브러리를 사용하여 HTML을 파싱하는 크롤러입니다.
const crawler = new CheerioCrawler({
// 크롤러는 웹 페이지를 병렬로 다운로드하고 처리합니다.
// 동시성은 사용 가능한 시스템 메모리와 CPU를 기반으로 자동 관리됩니다(AutoscaledPool 클래스 참조).
// 여기서는 동시성에 대한 제한을 설정합니다.
minConcurrency: 10,
maxConcurrency: 50,
// 오류 발생 시 각 페이지를 최대 한 번만 재시도합니다.
maxRequestRetries: 1,
// 각 페이지 처리 시간 제한을 늘립니다.
requestHandlerTimeoutSecs: 30,
// 크롤링당 최대 10개의 요청으로 제한합니다.
maxRequestsPerCrawl: 10,
// 이 함수는 크롤링할 각 URL에 대해 호출됩니다.
// 옵션이 포함된 객체를 매개변수로 받습니다:
// https://crawlee.dev/api/cheerio-crawler/interface/CheerioCrawlerOptions#requestHandler
// 데모를 위해 다음 2가지만 사용합니다:
// - request: 크롤링 중인 URL 및 HTTP 메서드와 같은 정보가 포함된 Request 클래스의 인스턴스
// - $: 파싱된 HTML이 포함된 cheerio 객체
async requestHandler({ pushData, request, $ }) {
log.debug(`Processing ${request.url}...`);
// cheerio를 사용하여 페이지에서 데이터를 추출합니다.
const title = $('title').text();
const h1texts: { text: string }[] = [];
$('h1').each((index, el) => {
h1texts.push({
text: $(el).text(),
});
});
// 결과를 데이터셋에 저장합니다. 로컬 구성에서는
// 데이터가 ./storage/datasets/default에 JSON 파일로 저장됩니다.
await pushData({
url: request.url,
title,
h1texts,
});
},
// 이 함수는 페이지 처리가 maxRequestRetries + 1회 이상 실패한 경우 호출됩니다.
failedRequestHandler({ request }) {
log.debug(`Request ${request.url} failed twice.`);
},
});
// 크롤러를 실행하고 완료될 때까지 기다립니다.
await crawler.run(['https://crawlee.dev']);
log.debug('Crawler finished.');