ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [가상면접 사례로 배우는 대규모 시스템 설계 기초] 9장. 웹 크롤러 설계
    📕 book/가상 면접 사례로 배우는 대규모 시스템 설계 기초 2026. 1. 4. 23:38

    웹 크롤러는 로봇 또는 스파이더라고도 부른다.

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

    🎯 크롤러 활용 예시

    활용 예시 설명
    검색 엔진 인덱싱 검색 엔진의 로컬 인덱스를 구축하기 위해 사용. 예시: Googlebot (구글 검색 엔진이 사용하는 웹 크롤러)
    웹 아카이빙 웹 사이트 정보를 주기적으로 수집하고 저장하여 아카이빙.
    웹 마이닝 인터넷에서 유용한 지식을 찾아 분석해 의미있는 지식을 도출
    웹 모니터링 저작권, 상표권이 침해되는 사례를 모니터링

     

     

    웹 크롤러의 복잡도는 처리해야 하는 데이터의 규모에 따라 달라진다.

     

    학급 프로젝트 수준일 수도 있고 별도의 엔지니어링 팀을 꾸려서 지속적으로 관리하고 개선해야 하는 초대형 프로젝트가 될 수도 있다.

    따라서, 설계한 웹 크롤러가 감당해야 하는 데이터의 규모와 기능들을 알아야 한다.

     

    ✅ 문제 이해 및 설계 범위 확정

    🤖 웹 크롤러의 기본 동작 원리

    1. URL 집합이 입력으로 주어지면 해당 URL들이 가리키는 모든 웹 페이지를 다운로드
    2. 다운받은 웹 페이지에서 URL들을 추출한다.
    3. 추출한 URL을 다시 수집할 URL 목록에 추가하여 이 과정을 반복한다.

    이는 단순해보이지만 엄청난 규모 확장성을 갖는 웹 크롤러를 설계하는 것은 매우 어려운 작업이다.

    • 요구사항을 질문을 통해 알아내고 설계 범위를 좁혀야 한다.

     

    🙋 질문 예시

    • 크롤러의 주된 용도는 무엇인가요? 검색 엔진 인덱스 생성용인가요? 데이터 마이닝? 그 외의 다른 용도?
    • 매달 얼마나 많은 웹 페이지를 수집해야 하나요?
    • 새로 만들어진 웹 페이지나 수정된 웹 페이지도 고려해야 하나요?
    • 수집한 웹 페이지는 저장해야 하나요?
    • 중복된 콘텐츠는 어떻게 해야 하나요?

     

    🚀 웹 크롤러가 만족시켜야 할 속성

    속성 설명
    규모 확장성 웹은 거대하기 때문에 병행성(병렬 처리) 등을 활용하여 수십억개의 페이지의 대량 데이터를 빠르게 처리할 수 있어야 한다.
    안정성 잘못된 HTML, 장애 서버, 악성 코드 등 비정상적 입력이나 환경에 잘 대응할 수 있어야 한다.
    예절 수집 대상 웹 사이트에 짧은 시간 동안 너무 많은 요청을 보내면 안된다.
    확장성 새로운 형태의 콘텐츠를 지원하기 쉬워야 한다. (예: 이미지)

     

    🧩 개략적 규모 추정

    항목 산출된 값
    월별 웹페이지 다운로드 수 10억 개
    QPS (초당 요청수) 10억 / 30 / 24 / 3600 = 400
    최대 QPS 2 * QPS = 800
    평균 웹 페이지 크기 500KB
    월별 저장 용량 10억 * 500KB = 500TB
    5년치 데이터 저장 용량 500TB * 12 * 5 = 30PB

     

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

    시작 URL 집합

    시작 URL 집합은 웹 크롤러가 크롤링을 시작하는 출발점이다.

     

    전체 웹을 크롤링해야 하는 경우에는 시작 URL을 고를 때 가능한 많은 링크를 탐색할 수 있도록 하는 URL을 고르는 것이 바람직하다.

    • 일반적으로는 전체 URL 공간을 작은 부분 집합으로 나누는 전략을 사용
    • 예를 들어 URL 공간을 쇼핑, 스포츠, 건강 등 주제별로 세분화하고 각각에 다른 시작 URL을 사용

     

    미수집 URL 저장소

    현대 웹 크롤러는 크롤링 상태를 2가지로 나누어 관리한다.

    • 다운로드할 URL
    • 다운로드된 URL

    다운로드할 URL을 저장 관리하는 컴포넌트를 미수집 URL 저장소(URL frontier) 라고 부른다.

    • FIFO Queue

     

    HTML 다운로더

    웹 페이지를 실제 다운로드 하는 컴포넌트

    다운로드할 페이지의 URL은 미수집 URL 저장소가 제공

     

    도메인 이름 변환기

    웹 페이지를 다운로드 받기 위해서는 URL을 IP 주소로 변환해야 한다.

    HTML 다운로더는 도메인 이름 변환기를 통해 URL의 IP 주소를 알아낸다.

     

    콘텐츠 파서

    웹 페이지를 다운로드하면 파싱과 검증 절차를 거쳐야 한다.

    • 이상한 웹 페이지는 문제를 발생시킬 수 있고 저장 공간 낭비이기 때문

    크롤링 서버 안에 콘텐츠 파서를 구현하면 크롤링 과정이 느려질 수 있기 때문에 독립된 컴포넌트로 만든다.

     

    중복 콘텐츠?

    공개된 연구 결과에 따르면 29% 가량의 웹 페이지 콘텐츠가 중복이라고 한다.

     

    따라서 같은 콘텐츠를 여러 번 저장할 수 있기 때문에 데이터 중복을 줄이고 데이터 처리에 소요되는 시간을 줄이기 위해서 해시 값을 비교하는 등의 방법을 이용해서 이미 시스템에 저장된 콘텐츠인지 확인해야 한다.

     

    콘텐츠 저장소

    HTML 문서를 보관하는 시스템으로 데이터의 유형, 크기, 저장소 접근 빈도, 데이터 유효 기간등을 고려해야 한다.

     

    URL 추출기

    HTML 문서들을 파싱하여 링크들을 골라내는 역할을 한다.

    • 상대 경로는 모두 절대 경로로 변환

     

    URL 필터

    추출한 URL을 걸러내어 크롤링 대상에서 배제하는 역할

    • 특정 콘텐츠 타입이나 파일 확장자를 갖는 URL (예: jpg, zip 등 제외)
    • 접속시 오류가 발생하는 URL
    • 접근 제외 목록 (deny list)에 포함된 URL

     

    이미 방문한 URL?

    이미 방문한 적이 있는 URL인지 확인하면 같은 URL을 여러 번 처리하는 일을 방지할 수 있다.

    • 이미 방문한 URL, 미수집 URL 저장소에 보관된 URL을 추적할 수 있는 자료구조를 사용
    • 블룸 필터나 해시 테이블이 널리 사용된다.

     

    URL 저장소

    이미 방문한 URL을 보관하는 저장소

     

    웹 크롤러 작업 흐름

    1. 시작 URL들을 미수집 URL 저장소에 저장
    2. HTML 다운로더는 미수집 URL 저장소에서 URL 목록을 가져온다.
    3. HTML 다운로더는 도메인 이름 변환기를 사용해 URL의 IP 주소를 가져와 접속해 웹 페이지를 다운
    4. 콘텐츠 파서는 다운된 HTML 페이지를 파싱해 올바른 페이지인지 검증
    5. 콘텐츠 파싱과 검증이 끝나면 중복 콘텐츠인지 확인
    6. 해당 페이지가 이미 저장소에 저장되어 있는지 확인
      • 저장소에 없다면 저장소에 저장한 뒤 URL 추출기로 전달
    7. URL 추출기는 해당 HTML 페이지에서 링크를 골라낸다.
    8. 골라낸 링크를 URL 필터로 전달
    9. 필터링이 끝나고 남은 URL만 중복 URL 판별 단계로 전달
    10. 이미 처리한 URL인지 확인하기 위해 URL 저장소에 보관된 URL인지 확인
    11. 저장소에도 없는 URL은 URL 저장소에 저장하고 미수집 URL 저장소에도 전달한다.

     

    💻 상세 설계

    중요한 컴포넌트와 구현 기술을 살펴보자.

    • DFS vs BFS
    • 미수집 URL 저장소
    • HTML 다운로더
    • 안정성 확보 전략
    • 확장성 확보 전략
    • 문제 있는 콘텐츠 감지 및 회피 전략

     

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

    웹은 유향 그래프(directed graph)와 같다.

    • 페이지는 노드, 하이퍼링크는 엣지

    따라서, 크롤링 프로세스는 유향 그래프를 에지를 따라 탐색하는 과정이다.

     

    DFS, BFS는 그래프 탐색에 널리 사용되는 알고리즘이다.

     

    DFS

    • 좋은 선택지는 아니다.
    • 그래프 크기가 클 수록 어느정도로 깊게 탐색할지 가늠하기 어렵기 때문

     

    BFS

    • 보통 FIFO queue 를 사용하는 알고리즘

     

    ⚠️ BFS FIFO queue 방식의 2가지 문제점

    1. 한 페이지에서 추출한 링크 대부분이 같은 호스트(서버)로 향하는 경우가 많아 특정 서버에 짧은 시간동안 여러 요청을 보내어 서버가 과부하에 걸릴 수 있다 (예의 없는 크롤러)
    2. BFS queue는 우선순위를 다루지 못해 페이지의 순위, 사용자 트래픽의 양 등 여러 기준을 반영해 처리 우선순위를 구별해주어야 한다.

     

    미수집 URL 저장소

    미수집 URL 저장소를 활용하면 예의를 갖춘 크롤러, URL 사이의 우선순위와 신선도를 구별하는 크롤러를 구현할 수 있다.

     

    📍 예의

    수집 대상 서버로 짧은 시간안에 너무 많은 요청을 보내는 것을 삼가야 한다.

    • 동일 웹 사이트에 대해서는 한 번에 한 페이지만 요청
    • 같은 웹 사이트의 페이지를 다운받는 태스크는 시간차를 두고 실행하도록 하면 된다.

     

    ⏬ 우선 순위

    유용성에 따라 URL의 우선순위를 나눌 때는 페이지랭크, 트래픽 양, 갱신 빈도 등의 다양한 척도를 사용할 수 있다.

    📖 페이지 랭크

    • 웹 페이지의 중요도를 측정
    • 구글 검색에 쓰이는 알고리즘
    • 상대적 중요도에 따라 가중치를 부여

     

    순위 결정 장치는 URL 우선순위를 정하는 컴포넌트로 큐에 URL을 저장하기전에 순위 결정 장치를 거치도록 설계를 수정한다.

    • 전면 큐: 우선순위 결정 과정 처리
    • 후면 큐: 크롤러가 예의 바르게 동작하도록 보증

    📍 신선도

     

    웹 페이지는 수시로 추가, 삭제, 변경되기 때문에 데이터의 신선도를 유지하기 위해서는 이미 다운로드한 페이지라고 하더라도 재수집할 필요가 있다.

    모든 URL을 재수집하는 것은 많은 자원이 필요하기 때문에 이 작업을 최적화하기 위한 전략으로는 다음과 같은 것들이 있다.

    • 웹 페이지의 변경 이력 활용
    • 우선순위를 활용해 중요한 페이지는 자주 재수집

     

    📦 미수집 URL 저장소를 위한 지속정 저장장치

    검색 엔진을 위한 크롤러의 경우 처리해야 하는 URL의 수는 수억 개.

    • 모든 URL을 메모리에 저장하는 방식: 안정성이나 확장성 측면에서 문제
    • 모든 URL을 디스크에 저장: 느려서 성능저하 (병목 지점)

     

    따라서 절충안으로 대부분의 URL은 디스크에 두지만 IO 비용을 줄이기 위해 메모리 버퍼에 queue를 두어 관리

    • 버퍼에 있는 데이터는 주기적으로 디스크에 기록

     

    HTML 다운로더

    HTML 다운로더는 HTTP 프로토콜을 통해 웹 페이지를 내려받는다.

     

    🤖 Robots.txt

    로봇 제외 프로토콜

    • 웹 사이트가 크롤러와 소통하는 표준적 방법

     

    이 파일에는 크롤러가 수집해도 되는 페이지 목록이 들어있다.

    • 크롤러는 사이트를 다운로드하기 전에 해당 파일에 나열된 규칙을 먼저 확인해야 한다.

    Robots.txt 파일을 중복으로 다운로드하는 것을 피하기 위해 주기적을도 다시 다운받아 캐시에 보관한다.

     

    User-agent: Googlebot
    Disallow: /creatorhub/*
    • Creatorhub와 같은 디렉터리 내용은 다운받을 수 없다.

     

    👍 성능 최적화

    HTML 다운로더에 사용할 수 있는 성능 최적화 기법

    기법 설명
    분산 크롤링 크롤링 작업을 여러 서버에 분산
    도메인 이름 변환 결과 캐시 DNS resolver는 크롤러 성능의 병목 중 하나. DNS 조회 결과로 얻은 도메인 이름과 IP 주소를 캐시에 보관하고 주기적으로 갱신
    지역성 크롤링 작업을 수행하는 서버를 지역별로 분산
    짧은 타임아웃 어떤 웹 서버는 응답이 느리거나 아예 응답하지 않기 때문에 최대 얼마나 크롤러가 기달릴지를 정해두고 타임아웃의 경우 해당 페이지 다운을 중단

     

    🔐 안정성

    안정성 역시 최적화된 성능처럼 설계시 중요한 부분이다.

    기법 설명
    분산 크롤링 크롤링 작업을 여러 서버에 분산
    도메인 이름 변환 결과 캐시 DNS resolver는 크롤러 성능의 병목 중 하나. DNS 조회 결과로 얻은 도메인 이름과 IP 주소를 캐시에 보관하고 주기적으로 갱신
    지역성 크롤링 작업을 수행하는 서버를 지역별로 분산
    짧은 타임아웃 어떤 웹 서버는 응답이 느리거나 아예 응답하지 않기 때문에 최대 얼마나 크롤러가 기달릴지를 정해두고 타임아웃의 경우 해당 페이지 다운을 중단

     

     

    ↗️ 확장성

    새로운 형태의 콘텐츠를 쉽게 지원할 수 있도록 신경써야 한다.

    예제에서는 새로운 모듈을 추가함으로 새로운 형태의 콘텐츠를 지원할 수 있도록 설계

    • PNG 다운로더는 PNG 파일을 다운로드하는 모듈
    • 웹 모니터는 웹을 모니터링하여 저작권, 상표권 침해를 막는 모듈

     

    ⚠️ 문제 있는 콘텐츠 감지 및 회피

    1️⃣ 중복 콘텐츠

     

    해시나 체크섬 등의 방법을 통해 중복 콘텐츠를 쉽게 탐지할 수 있다.

     

    2️⃣ 거미 덫 (spider trap)

    크롤러를 무한루프에 빠뜨리도록 설계한 웹 페이지

    • 무한히 깊은 디렉토리 구조 (spidertrapexample.com/foo/bar/foo/bar/foo/bar…)

    URL의 최대 길이를 제한하면 회피할 수 있다.

    • 모든 종류를 다 피할수는 없다.

    수작업을 통해 확인하고 찾아내어 크롤러 탐색 대상에서 제외하거나 URL 제외 필터 목록에 넣어둔다.

     

    3️⃣ 데이터 노이즈

    어떤 콘텐츠는 가치가 없을 수 있다.

    • 광고, 스크립트 코드 등 이런 콘텐츠는 가능한 제외해야 한다.

     

    👊 마무리

    좋은 크롤러가 갖추어야하는 특성

    특성 설명
    규모 확장성 수십억개의 웹 페이지를 수집하고 처리할 수 있도록 분산 시스템 구조, 확장 가능한 저장소 설계
    예의 크롤러 대상 서버에 과도한 부하를 주지 않도록 한 호스트에 일정 시간동안 간격을 두고 요청
    확장성 새로운 콘텐츠 유형이 추가될 때 쉽게 기능을 확장할 수 있어야 한다.
    안정성 예외 상황에서도 서비스가 멈추지 않도록 장애 대응, 데이터 무결성, 자동 복구 등을 처리

    댓글

Designed by Tistory.