본문으로 건너뛰기

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 같은 다른 리소스의 링크를 포함하고 있어, 이것들을 추가로 다운로드해서 최종 페이지를 구성합니다. 이런 페이지를 크롤링하려면 PuppeteerCrawlerPlaywrightCrawler를 사용하세요.

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 코드를 확인할 수 있습니다.