크롤링 관점에서 본 웹사이트 종류
웹사이트를 크롤링하려면, 그 사이트가 어떤 방식으로 콘텐츠를 제공하는지 알아야 한다. 같은 데이터라도 제공 방식에 따라 크롤링 전략이 완전히 달라진다.
렌더링 방식에 따른 분류
웹사이트가 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>
왜 어려운가:
- 초기 HTML엔 데이터가 없음
- JavaScript 실행 환경 필요
- 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
크롤링 방식:
- 추천: Network 탭에서 AJAX endpoint 찾아서 직접 호출
- 대안: Headless browser로 스크롤 이벤트 시뮬레이션
4. AJAX/XHR 동적 로딩
특징: 페이지는 그대로인데, 특정 영역만 JavaScript로 데이터 가져와서 갱신.
크롤링 난이도: ⭐⭐⭐ (보통)
예시:
- 댓글 "더보기" 버튼
- 탭 전환 시 콘텐츠 로드
- 실시간 업데이트 (주식 시세 등)
크롤링 방식: Network 탭에서 XHR/Fetch 요청 찾아서 그 endpoint 직접 호출.
5. WebSocket 실시간 데이터
특징: 서버와 양방향 통신하면서 실시간으로 데이터 업데이트.
크롤링 난이도: ⭐⭐⭐⭐⭐ (매우 어려움)
예시:
- 실시간 채팅
- 실시간 주식 차트
- 스포츠 경기 라이브 스코어
크롤링 방식: WebSocket 프로토콜 직접 구현하거나, Headless browser 사용.
접근 제어 방식에 따른 분류
1. 완전 공개
특징: 로그인 없이 누구나 접근 가능.
크롤링 난이도: ⭐ (쉬움)
2. 로그인 필요
특징: 세션/쿠키 기반 인증 필요.
크롤링 난이도: ⭐⭐⭐ (보통)
크롤링 방식:
- 로그인 API endpoint 찾기
- 세션 쿠키 저장해서 이후 요청에 포함
- 또는 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>
크롤링 방식:
- HTML 가져오기
<script>태그 찾기- JSON 파싱
HTML 파싱보다 훨씬 깔끔함.
3. GraphQL
특징: REST API 대신 GraphQL endpoint 사용.
크롤링 난이도: ⭐⭐ (쉬움)
크롤링 방식:
- Network 탭에서 GraphQL query 찾기
- 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 시스템 | 고급 기법 + 윤리 고려 | ⭐⭐⭐⭐⭐ |
핵심 원칙:
- 공식 API 최우선
- HTML에 데이터 있으면 static crawling
- JavaScript 필수면 먼저 Network 탭 확인
- 정 안 되면 Headless browser
- Anti-bot 있으면 윤리적 판단 필요