learn

웹 크롤링 방식과 프레임워크

웹 크롤링 방식과 프레임워크

웹 크롤링은 크게 세 가지 접근 방식으로 나뉜다. 각 방식은 대상 웹사이트의 렌더링 방식에 따라 선택된다.

1. 정적 크롤링 (Static Crawling)

언제 사용하는가?

서버가 완성된 HTML을 직접 응답하는 전통적인 웹사이트에 적합하다. JavaScript 없이도 모든 콘텐츠가 초기 HTML에 포함되어 있는 경우다.

작동 원리

HTTP 요청 → HTML 응답 수신 → HTML 파싱 → 데이터 추출

이 방식은 가장 빠르고 리소스 효율적이다. 브라우저를 실행할 필요가 없기 때문이다.

프레임워크

Python:

  • requests + BeautifulSoup - 가장 기본적인 조합. 학습 곡선이 완만함
  • scrapy - 본격적인 크롤링 프레임워크. 비동기 처리, 파이프라인, 미들웨어 등 production-ready 기능 제공
  • httpx + parsel - 최신 async HTTP 클라이언트와 파서의 조합

Rust:

  • reqwest + scraper - Python의 requests + BeautifulSoup에 대응하는 조합
  • surf + select - 대안적인 조합
  • spider - scrapy와 유사한 full-featured 크롤링 프레임워크

2. 동적 크롤링 (Dynamic Crawling)

언제 사용하는가?

JavaScript로 콘텐츠를 동적으로 생성하는 SPA(Single Page Application)나 무한 스크롤 방식의 사이트에 필수적이다. 초기 HTML은 거의 비어있고, JavaScript가 실행되어야만 실제 콘텐츠가 나타나는 경우다.

작동 원리

브라우저 자동화 → JavaScript 실행 대기 → 렌더링된 DOM 추출

실제 브라우저(또는 headless 브라우저)를 제어하므로 리소스 소모가 크다. 하지만 사람이 보는 것과 동일한 화면을 볼 수 있다는 장점이 있다.

프레임워크

Python:

  • selenium - 가장 오래되고 검증된 도구. Chrome, Firefox 등 제어 가능
  • playwright - Microsoft가 개발한 최신 브라우저 자동화 도구. Selenium보다 빠르고 안정적
  • pyppeteer - Node.js의 Puppeteer를 Python으로 포팅한 버전

Rust:

  • fantoccini - WebDriver 프로토콜 기반 (Selenium과 유사한 방식)
  • headless_chrome - Chrome DevTools Protocol을 직접 사용
  • thirtyfour - Selenium WebDriver의 Rust 구현체

3. API 기반 크롤링

언제 사용하는가?

웹사이트가 공식 API를 제공하거나, 브라우저 개발자 도구로 확인한 비공개 API 엔드포인트를 활용할 수 있을 때 사용한다. 가장 효율적인 방법이다.

작동 원리

개발자 도구 네트워크 탭 분석 → API 엔드포인트 파악 → 직접 HTTP 요청

HTML 파싱이나 JavaScript 실행 없이 순수 데이터(주로 JSON)를 받아오므로 매우 빠르다.

프레임워크

Python:

  • requests / httpx - 기본적인 HTTP 클라이언트로 충분
  • aiohttp - 대량의 비동기 요청이 필요한 경우

Rust:

  • reqwest - 가장 널리 사용되는 HTTP 클라이언트
  • surf / ureq - 대안적인 선택지들

선택 기준

속도 vs 범용성

  • 속도: API > 정적 > 동적
  • 범용성: 동적 > 정적 > API

대부분의 크롤링 프로젝트는 다음 순서로 진행된다:

  1. 정적 크롤링으로 시도
  2. JavaScript 렌더링이 필요하면 동적 크롤링으로 전환
  3. 운이 좋으면 API 엔드포인트를 발견하여 최적화

의사결정 흐름

실전 팁

  • 개발자 도구의 네트워크 탭을 먼저 열어보라. API를 찾을 수 있다면 가장 효율적이다.
  • 정적 크롤링이 가능한데 동적 크롤링을 쓰는 것은 리소스 낭비다.
  • 하지만 무조건 빠른 것만 좋은 게 아니다. 유지보수 가능성과 개발 속도도 고려해야 한다.