Crawlee: AI와 LLM을 위한 데이터를 수집하는 Node.js 웹 스크래핑 라이브러리

Crawlee 소개

LLM이나 RAG 파이프라인에 넣을 데이터를 웹에서 모으려면 단순히 페이지를 내려받는 것 이상이 필요합니다. 요청 큐를 관리하고, 봇 차단을 피하고, 실패한 요청을 재시도하고, 수집한 결과를 저장하는 배관을 직접 만들다 보면 정작 데이터 추출 로직보다 크롤러 인프라에 시간을 더 쓰게 됩니다. HTTP 요청만으로 충분한 사이트와 자바스크립트 렌더링이 필요한 사이트가 섞여 있으면 코드가 두 갈래로 갈라지는 문제도 생깁니다.

Crawlee는 이런 크롤링과 스크래핑 과정을 처음부터 끝까지 다루는 Node.js 라이브러리로, 신뢰할 수 있는 스크래퍼를 빠르게 만드는 것을 목표로 합니다. Apify가 개발했으며 JavaScript와 TypeScript로 작성되어 있고, 설명에 따르면 AI, LLM, RAG, GPT에 넣을 데이터를 추출하는 용도를 염두에 두고 있습니다. 기본 설정만으로도 크롤러가 사람처럼 동작해 최신 봇 보호 장치를 피하도록 만들어져 있습니다.

Crawlee는 링크를 따라 웹을 순회하고, 데이터를 스크래핑하고, 그 결과를 디스크나 클라우드에 저장하는 일련의 과정을 하나의 인터페이스로 묶습니다. 파이썬을 선호하는 경우를 위해 Crawlee for Python 도 별도로 제공됩니다.

Crawlee의 두 가지 크롤링 방식

Crawlee의 핵심 설계는 HTTP 크롤링과 실제 브라우저 크롤링을 하나의 인터페이스로 함께 지원한다는 점입니다. 아래 그림은 두 방식의 특징을 정리한 것입니다.

가벼운 HTTP 크롤링에서는 별도 설정 없이 HTTP2를 지원하고, 브라우저처럼 보이는 헤더를 자동 생성하며, 브라우저의 TLS 지문(fingerprint) 을 복제합니다. HTML 파싱에는 Cheerio와 JSDOM을 통합해 사용하고, JSON API도 그대로 스크래핑할 수 있습니다.

자바스크립트 렌더링이 필요한 사이트에는 실제 브라우저 크롤링을 씁니다. 헤드리스(headless) 와 헤드풀(headful) 모드를 모두 지원하고, 사람처럼 보이는 지문을 별도 설정 없이 생성하며, Playwright와 Puppeteer를 같은 인터페이스로 다룰 수 있습니다. Chrome, Firefox, WebKit 등 여러 브라우저를 지원합니다.

Crawlee의 주요 기능

두 크롤링 방식 위에 Crawlee는 크롤러 운영에 필요한 공통 기능을 제공합니다.

  • 영속적 큐: 크롤링할 URL을 너비 우선·깊이 우선으로 관리하는 지속적인 큐를 제공합니다.
  • 저장소 플러그인: 표 형태 데이터와 파일을 함께 저장할 수 있는 교체 가능한 저장소를 지원합니다.
  • 자동 스케일링: 사용 가능한 시스템 자원에 맞춰 크롤링을 자동으로 확장합니다.
  • 프록시 로테이션: 프록시 순환과 세션 관리가 통합되어 있습니다.
  • 라우팅과 재시도: 설정 가능한 라우팅, 오류 처리, 재시도 로직을 제공하며, 배포용 Dockerfile도 준비되어 있습니다.

Crawlee 설치 및 사용법

Crawlee는 Node.js 16 이상 환경에서 동작합니다. 가장 빠르게 시작하는 방법은 CLI로 프로젝트 골격을 만드는 것입니다.

npx crawlee create my-crawler
cd my-crawler
npm start

기존 프로젝트에 직접 추가할 때는 npm으로 설치합니다. 아래 예시는 PlaywrightCrawler 를 쓰므로 Playwright도 함께 설치합니다.

npm install crawlee playwright

다음은 각 페이지의 제목을 수집하고 링크를 큐에 추가하는 최소 예시입니다.

import { PlaywrightCrawler, Dataset } from 'crawlee';

const crawler = new PlaywrightCrawler({
    async requestHandler({ request, page, enqueueLinks, log }) {
        const title = await page.title();
        log.info(`Title of ${request.loadedUrl} is '${title}'`);
        await Dataset.pushData({ title, url: request.loadedUrl });
        await enqueueLinks();
    },
});

await crawler.run(['https://crawlee.dev']);

기본적으로 수집한 데이터는 현재 작업 디렉토리의 ./storage 에 저장되며, 설정을 통해 저장 위치를 바꿀 수 있습니다.

Crawlee의 라이선스

Crawlee는 Apache 2.0 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.

:house: Crawlee 공식 홈페이지 및 문서

:github: Crawlee 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. :smiley:

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요