research

크롤링 관점에서 본 웹사이트 종류

크롤링 관점에서 본 웹사이트 종류

웹사이트를 크롤링하려면, 그 사이트가 어떤 방식으로 콘텐츠를 제공하는지 알아야 한다. 같은 데이터라도 제공 방식에 따라 크롤링 전략이 완전히 달라진다.

렌더링 방식에 따른 분류

웹사이트가 HTML을 "언제, 어디서" 만드는지에 따라 나뉜다.

1. SSR (Server-Side Rendering)

특징: 서버가 요청받을 때마다 완성된 HTML을 만들어서 보내줌.

크롤링 난이도: ⭐ (쉬움)

예시:

  • 전통적인 PHP, Django, Rails 사이트
  • 네이버 뉴스, 위키피디아
  • WordPress 블로그

크롤링 방식: HTTP request만으로 충분. requests + BeautifulSoup 같은 기본 도구로 가능.

HTML 예시:

<!-- 서버에서 이미 완성된 상태로 옴 -->
<div class="article">
  <h1>뉴스 제목</h1>
  <p>본문 내용이 여기 다 들어있음</p>
</div>

2. SSG (Static Site Generation)

특징: 빌드 타임에 미리 HTML을 다 만들어놓고, 그걸 그냥 서빙함.

크롤링 난이도: ⭐ (쉬움)

예시:

  • Gatsby, Next.js (정적 빌드)
  • GitHub Pages 블로그
  • 기술 문서 사이트 (Docusaurus 등)

크롤링 방식: SSR과 동일. 이미 완성된 HTML이 있으니 HTTP request만 하면 됨.

SSR과의 차이:

  • SSR: 요청 올 때마다 서버가 HTML 생성
  • SSG: 한 번 빌드하면 정적 파일로 존재

크롤링 입장에선 둘 다 똑같음. 어차피 완성된 HTML 받는 건 동일.


3. CSR (Client-Side Rendering)

특징: 서버는 빈 HTML 껍데기만 주고, 브라우저에서 JavaScript가 실행되면서 콘텐츠를 채움.

크롤링 난이도: ⭐⭐⭐⭐ (어려움)

예시:

  • React, Vue, Angular로 만든 대부분의 SPA
  • Gmail, Google Docs
  • 많은 관리자 대시보드

크롤링 방식: Headless browser 필요 (Playwright, Selenium 등). 아니면 API endpoint 역공학.

HTML 예시:

<!-- HTTP request로 받는 초기 HTML -->
<div id="root"></div>
<script src="bundle.js"></script>

<!-- JavaScript 실행 후 -->
<div id="root">
  <div class="article">
    <h1>뉴스 제목</h1>
    <p>본문 내용</p>
  </div>
</div>

왜 어려운가:

  1. 초기 HTML엔 데이터가 없음
  2. JavaScript 실행 환경 필요
  3. API 호출 타이밍, 비동기 로딩 처리해야 함

우회 전략: 브라우저 개발자도구 Network 탭에서 실제 데이터 가져오는 API endpoint 찾아서 직접 호출. 이게 더 빠르고 안정적.


4. ISR (Incremental Static Regeneration)

특징: SSG + SSR 혼합. 처음엔 정적 페이지 서빙하다가, 주기적으로 또는 요청 시 재생성.

크롤링 난이도: ⭐⭐ (보통)

예시:

  • Next.js ISR 모드
  • 상품 목록 같은 자주 변하는 콘텐츠

크롤링 방식: 기본적으로 SSR처럼 크롤링 가능. 단, 캐시 타이밍 이해해야 최신 데이터 가져옴.


콘텐츠 로딩 방식에 따른 분류

페이지 안에서 데이터가 어떻게 로드되는지.

1. 정적 페이지

특징: 페이지 로드하면 모든 콘텐츠가 다 있음.

크롤링 난이도: ⭐ (쉬움)

한 번 요청으로 모든 데이터 획득 가능.


2. Pagination (페이지네이션)

특징: 1페이지, 2페이지, 3페이지... 명시적으로 나뉨.

크롤링 난이도: ⭐⭐ (쉬움)

예시:

  • 게시판 (?page=1, ?page=2)
  • 검색 결과

크롤링 방식: URL 패턴 파악해서 반복문 돌리면 됨.

for page in range(1, 101):
    url = f"https://example.com/articles?page={page}"
    # 크롤링

3. Infinite Scroll (무한 스크롤)

특징: 스크롤 내리면 자동으로 다음 콘텐츠 로드.

크롤링 난이도: ⭐⭐⭐ (보통~어려움)

예시:

  • 인스타그램, 트위터 피드
  • Pinterest, Behance

크롤링 방식:

  1. 추천: Network 탭에서 AJAX endpoint 찾아서 직접 호출
  2. 대안: Headless browser로 스크롤 이벤트 시뮬레이션

4. AJAX/XHR 동적 로딩

특징: 페이지는 그대로인데, 특정 영역만 JavaScript로 데이터 가져와서 갱신.

크롤링 난이도: ⭐⭐⭐ (보통)

예시:

  • 댓글 "더보기" 버튼
  • 탭 전환 시 콘텐츠 로드
  • 실시간 업데이트 (주식 시세 등)

크롤링 방식: Network 탭에서 XHR/Fetch 요청 찾아서 그 endpoint 직접 호출.


5. WebSocket 실시간 데이터

특징: 서버와 양방향 통신하면서 실시간으로 데이터 업데이트.

크롤링 난이도: ⭐⭐⭐⭐⭐ (매우 어려움)

예시:

  • 실시간 채팅
  • 실시간 주식 차트
  • 스포츠 경기 라이브 스코어

크롤링 방식: WebSocket 프로토콜 직접 구현하거나, Headless browser 사용.


접근 제어 방식에 따른 분류

1. 완전 공개

특징: 로그인 없이 누구나 접근 가능.

크롤링 난이도: ⭐ (쉬움)


2. 로그인 필요

특징: 세션/쿠키 기반 인증 필요.

크롤링 난이도: ⭐⭐⭐ (보통)

크롤링 방식:

  1. 로그인 API endpoint 찾기
  2. 세션 쿠키 저장해서 이후 요청에 포함
  3. 또는 Selenium 등으로 실제 로그인 시뮬레이션

주의: 이용약관 위반 가능성 확인 필수.


3. API 키/토큰 인증

특징: OAuth, JWT 같은 토큰 기반 인증.

크롤링 난이도: ⭐⭐ (쉬움~보통)

예시:

  • Twitter API
  • GitHub API

공식 API 문서 보고 따라하면 됨.


4. Rate Limiting

특징: 단위 시간당 요청 수 제한.

크롤링 난이도: ⭐⭐⭐ (보통)

대응:

  • time.sleep() 넣기
  • 요청 간격 랜덤화
  • Proxy rotation
  • API rate limit 준수

5. Anti-bot 시스템

특징: Cloudflare, reCAPTCHA, 자체 봇 탐지 시스템.

크롤링 난이도: ⭐⭐⭐⭐⭐ (매우 어려움)

예시:

  • Cloudflare 챌린지
  • Google reCAPTCHA v3
  • 행동 패턴 분석 (마우스 움직임, 타이핑 속도 등)

대응:

  • User-Agent, 헤더 조작
  • Proxy 사용
  • Selenium stealth 모드
  • CAPTCHA 우회 서비스 (유료, 윤리적 문제)

윤리적 고려: 사이트가 명시적으로 막았다면 크롤링하지 않는 게 맞음.


데이터 제공 방식에 따른 분류

1. HTML 직접 파싱

특징: 데이터가 HTML에 직접 박혀있음.

가장 흔한 케이스.


2. JSON in HTML

특징: HTML 안에 <script> 태그로 JSON 데이터가 박혀있음.

예시:

<script type="application/json" id="__NEXT_DATA__">
  {"props": {"pageProps": {"articles": [...]}}}
</script>

크롤링 방식:

  1. HTML 가져오기
  2. <script> 태그 찾기
  3. JSON 파싱

HTML 파싱보다 훨씬 깔끔함.


3. GraphQL

특징: REST API 대신 GraphQL endpoint 사용.

크롤링 난이도: ⭐⭐ (쉬움)

크롤링 방식:

  1. Network 탭에서 GraphQL query 찾기
  2. POST request로 직접 호출

4. 공식 REST API

특징: 문서화된 공식 API 제공.

크롤링 난이도: ⭐ (쉬움)

가장 이상적. 문서 보고 따라하면 됨.


크롤링 전략 선택 플로우차트


요약

| 웹사이트 유형 | 크롤링 도구 | 난이도 | |--------------|------------|--------| | SSR/SSG 정적 페이지 | requests + BeautifulSoup | ⭐ | | Pagination | requests + 반복문 | ⭐⭐ | | CSR/SPA (API 찾음) | httpx + JSON 파싱 | ⭐⭐ | | Infinite Scroll (API 찾음) | aiohttp + 비동기 | ⭐⭐⭐ | | CSR/SPA (API 못 찾음) | Playwright | ⭐⭐⭐⭐ | | Anti-bot 시스템 | 고급 기법 + 윤리 고려 | ⭐⭐⭐⭐⭐ |

핵심 원칙:

  1. 공식 API 최우선
  2. HTML에 데이터 있으면 static crawling
  3. JavaScript 필수면 먼저 Network 탭 확인
  4. 정 안 되면 Headless browser
  5. Anti-bot 있으면 윤리적 판단 필요