[대규모 시스템 설계 기초] 9장) 웹 크롤러 설계

동동주·2025년 12월 10일

웹 크롤러: 검색 엔진에서 널리 쓰는 기술, 웹에 새로 올라오거나 갱신된 콘텐츠를 찾아내는 것이 주된 목적

  • 검색 엔진 인덱싱: 크롤러는 웹 페이지를 모아 검색 엔진을 위한 로컬 인덱스 만듦
  • 웹 아카이빙: 나중에 사용할 목적으로 장기보관하기 위해 웹에서 정보를 모음
  • 웹 마이닝
  • 웹 모니터링

1단계 문제 이해 및 설계 범위 확정

  • 웹 크롤러의 기본 알고리즘
  1. 초기 URL 집합을 입력으로 받는다.
  2. 각 URL에 연결된 웹 페이지를 다운로드한다.
  3. 페이지를 파싱하여 새로운 URL을 추출한다.
  4. 추출된 URL을 ‘다운로드할 URL 목록’에 추가한다.
  5. 위 과정을 반복하여 탐색을 확장한다.

2단계 개략적 설계안 제시 및 동의 구하기

  • 시작 URL 집합: 탐색을 시작할 초기 URL 그룹.
  • 미수집 URL 저장소
    • 다운로드할 URL들을 FIFO 큐 방식으로 처리
  • HTML 다운로더: HTTP 요청을 통해 페이지를 가져옴.
  • 도메인 이름 변환기 (DNS Resolver):
  • URL을 IP 주소로 매핑하며, 캐싱을 통해 성능 향상.
  • 콘텐츠 파서
    • 이상한 웹페이지는 문제 발생 & 저장공간 낭비, so 파싱과 검증 절차를 거쳐야 함.
    • 추가로, 크롤링 서버 안에 콘텐츠 파서를 구현하면 크롤링 과정이 느려지게 될 수 있으므로 독립된 컨포넌트로 만듦
  • 중복된 컨텐츠인가?
    • 웹 페이지 해시값(예: MD5, SHA-1)을 활용해 동일 콘텐츠 판별.
    • 실제 웹의 약 25~30%가 중복 콘텐츠로 추정됨.
  • 콘텐츠 저장소
    • HTML 문서를 보관하는 시스템
    • 데이터 양이 너무 많을 땐, 대부분의 콘텐츠는 디스크에 저장
    • 인기 있는 콘텐츠는 메모리에 두어 접근 지연시간 줄임
  • URL 추출기
    • HTML 페이지를 파싱하여 링크들을 골라내는 역할
  • URL 필터
    • 특정 조건(정규 표현식, 도메인 제한, 파일 확장자 등)에 해당하는 URL들을 크롤링 대상에서 배제하는 역할
  • 이미 방문 URL?
    • 블룸 필터나 해시 테이블로 처리
  • URL 저장소
    • 이미 방문한 URL 보관하는 저장소

3단계 상세 설계

DFS를 쓸 것인가, BFS를 쓸 것인가

웹은 유향 그래프나 같다. 페이지는 노드이고 하이퍼링크(url)은 edge라고 보면 된다.

  • 그래프 탐색에는 보통 DFS, BFS가 많이 쓰이는데 DFS는 그래프 크기가 클 경우 어느 정도로 깊숙이 가게 될지 가늠이 어렵기에 좋은 선택이 아닐 가능성이 높다.

    그래서!! 웹 크롤러는 보통 BFS(너비 우선 탐색법)을 사용한다.
    BFS는 FIFO 큐를 사용한다. 큐의 한쪽으론는 탐색할 URL을 집어넣고, 다른 한쪽으로는 꺼내기만 한다. 하지만 이 구현법에는 두 가지 문제점이 있다.
    1) 한 페이지에서 나오는 링크의 상당수는 같은 서버로 되돌아간다. 위키피디아 페이지에서 추출한 링크가 내부 링크, 위키피디아 서버의 다른 페이지를 참조하게 되는...그럼 위키피디아 서버는 수많은 요청으로 과부하가 걸리게 된다.
    2) BFS는 URL 간에 우선순위를 두지 않는다. 하지만 페이지 순위, 사용자 트래픽의 양, 업데이트 빈도에 따라 우선순위 구별이 필요하다.

미수집 URL 저장소

미수집 URL 저장소로 위 문제 해결 가능!

1) 예의
예의 바른 크롤러를 만드는 데 있어서 지켜야 할 한 가지 원칙은, 동일 웹 사이트에 대해서는 한 번에 한 페이지만 요청한다는 것이다.
2) 우선순위

  • 페이지랭크, 트래픽 양, 갱신 빈도
  • 순위결정장치: URL을 입력으로 받아 우선순위를 계산한다.
  • 전면 큐, 후면 큐
    3) 신선도
    모든 URL을 재수집하는 건 비효율 적. 최적화 전략: 웹 페이지의 변경 이력 활용, 우선순의를 활용하여 중요 페이지 더 자주 재수집

HTML 다운로더

  • Robots.txt
  • 성능 최적화
    • 분산 크롤러 구조: 여러 서버 간 작업 분할.
    • DNS 캐싱: 동일 도메인 요청 시 이름 해석 비용 최소화.
    • 네트워크 지역성(Locality): 지리적으로 가까운 서버 우선 요청.
    • 짧은 타임아웃: 응답이 느린 서버로 인한 병목 방지.
  • 안정성
    • 크롤링 상태 및 수집 데이터 저장: 중단되었던 크롤링을 쉽게 재시작할 수 있게
    • 장애 시 안정 해시(Consistent Hashing) 로 URL 재분배.
    • 예외 처리 및 재시도 로직 존재.
  • 확장성
  • 문제 있는 콘텐츠 감지 및 회피
    • 중복 콘텐츠 (해시나 체크섬 사용)
    • 거미 덫: 크롤러를 무한 루프에 빠지게 함, 최대 길이를 제한하기
    • 데이터 노이즈: 가치 없는 콘텐츠들 예외

4단계 마무리

시간이 허락한다면 다음과 같은 것을 추가로 논의해보면 좋다.

  • 서버 측 렌더링(동적 렌더링)
  • 원치 않는 페이지 필터링
  • 데이터베이스 다중화 및 샤딩
  • 수평적 규모 확장성
  • 가용성, 일관성, 안정성
  • 데이터 분석 솔루션

0개의 댓글