CheerioCrawler 가이드
CheerioCrawler
는 가장 간단하고 빠른 크롤러입니다. jQuery에 익숙하다면 CheerioCrawler
를 금방 이해할 수 있습니다.
Cheerio란?
Cheerio는 Node.js용 jQuery라고 생각하시면 됩니다. jQuery와 동일한 API를 제공하며, 친숙한 $
객체도 사용할 수 있습니다. HTML 페이지의 DOM을 조작하는 데 jQuery처럼 사용할 수 있죠. 크롤링할 때는 주로 필요한 요소를 선택하고 원하는 데이터를 추출하는 데 사용합니다. jQuery는 브라우저에서 실행되고 브라우저의 DOM에 직접 연결되는 반면, cheerio
는 어떻게 HTML을 가져올까요? 바로 여기서 CheerioCrawler
의 크롤러 부분이 등장합니다.
크롤러의 작동 방식
CheerioCrawler
는 특별히 제작된 got-scraping HTTP 클라이언트를 사용하여 URL에 HTTP 요청을 보내는 방식으로 크롤링합니다. URL들은 RequestQueue
를 통해 크롤러에 전달됩니다. 받은 HTTP 응답은 보통 HTML 페이지입니다. 브라우저에서 URL을 처음 로드할 때 받는 것과 동일한 페이지죠. additionalMimeTypes
옵션을 사용하면 다른 콘텐츠 유형도 처리할 수 있습니다.
최신 웹페이지들은 첫 HTML 응답에 모든 콘텐츠를 포함하지 않는 경우가 많습니다. 대신 CSS와 JavaScript 같은 다른 리소스의 링크를 포함하고 있어, 이것들을 추가로 다운로드해서 최종 페이지를 구성합니다. 이런 페이지를 크롤링하려면 PuppeteerCrawler
나 PlaywrightCrawler
를 사용하세요.
HTML을 가져오면 크롤러는 이를 Cheerio로 파싱합니다. 결과물로 jQuery 사용자들에게 친숙한 $
함수가 제공됩니다. 이 함수로 페이지의 HTML을 다양하게 조작할 수 있지만, 스크래핑에서는 주로 특정 HTML 요소를 찾고 데이터를 추출하는 데 사용합니다.
Cheerio의 $
함수 사용 예시 (브라우저 JavaScript와 비교):
// <title> 요소의 텍스트 내용을 반환
document.querySelector('title').textContent; // 일반 JS
$('title').text(); // Cheerio
// 페이지의 모든 'href' 링크를 배열로 반환
Array.from(document.querySelectorAll('[href]')).map(el => el.href); // 일반 JS
$('[href]')
.map((i, el) => $(el).attr('href'))
.get(); // Cheerio
이는 Cheerio가 일반 브라우저 JavaScript보다 더 낫다는 의미가 아닙니다. 오히려 일반 JS의 더 명확한 방식을 선호하는 분들도 있죠. 하지만 브라우저 JavaScript 메서드는 Node.js에서 사용할 수 없기 때문에, Node.js에서 파싱하려면 Cheerio가 최선의 선택입니다.
CheerioCrawler 사용 시기
CheerioCrawler
는 매우 높은 작업량을 처리해야 할 때 진가를 발휘합니다. 4GB 메모리와 단일 CPU 코어만으로도 분당 500페이지 이상을 스크래핑할 수 있습니다! (페이지당 약 400KB HTML 기준) PlaywrightCrawler
같은 브라우저 기반 스크래퍼로 이 정도 속도를 내려면 훨씬 더 많은 컴퓨팅 파워가 필요합니다.
장점:
- 매우 빠르고 운영 비용이 저렴
- 설정이 간단
- jQuery 사용자에게 친숙
- 일부 안티스크래핑 차단을 자동으로 회피
단점:
- JavaScript 렌더링이 필요한 웹사이트에서는 작동하지 않음
- 대상 웹사이트에 쉽게 과부하를 줄 수 있음
- 스크래핑 전 웹사이트 조작이 불가능
Cheerio를 사용한 웹 스크래핑 예제
요소의 텍스트 내용 가져오기
첫 번째 <h2>
요소를 찾아 텍스트 내용을 반환합니다.
$('h2').text()
페이지의 모든 링크 찾기
href
속성이 있는 모든 <a>
요소를 찾아 href 값을 배열로 추출합니다.
$('a[href]')
.map((i, el) => $(el).attr('href'))
.get();
더 많은 예제
예제 섹션에서 CheerioCrawler
사용 예제를 더 찾아보세요. 대부분의 예제에서 CheerioCrawler
코드를 확인할 수 있습니다.