9. 웹 크롤러 설계

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

  • URL 집합이 입력으로 주어지면, 해당 URL들이 가리키는 모든 웹 페이지를 다운로드 한다.

  • 다운받은 웹 페이지에서 URL들을 추출한다.

  • 추출된 URL들을 다운로드할 URL 목록에 추가하고 위 과정을 처음부터 반복한다.

  • 웹 크롤러는 단순하지 않음. 그러므로 설계 범위를 좁히는 것이 중요

    • 크롤러의 주된 용도는?

    • 얼마나 많은 웹 페이지를 수입해야함?

    • 새로 만들어진 웹페이지나, 수정된 웹페이지도 고려?

    • 수집한 웹페이지는 저장?

    • 중복된 콘텐츠는?

  • 좋은 웹 크롤러가 만족해야할 속성

    • 병행성

    • 비정상적인 입력, 환경에 잘 대응

    • 짦은 시간 너무 많은 요청을 보내서는 안됨

    • 확장성

  • 매달 10억개 웹페이지 다운로드

  • QPS= 10억

    • 대략 400페이지 / 초

  • 최대 QPS = 2 * QPS = 800

  • 웹페이지 크기 , 500k

  • 10억 페이지 x 500k = 500TB/월

    • 5년간 보관 30PB

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

![[Pasted image 20250928160739.png]]

시작 URL 집합

  • 웹 크롤러가 크롤링을 시작하는 출발점 미수집 URL 저장소

  • 다운로드할 URL을 저장하는 컴포넌트

  • URL Frontier

  • FIFO (First in First Out)

HTML 다운로더

  • 인터넷에서 웹 페이즈를 다운로드 하는 컴포넌트

도메인 이름 변환기

  • 웹 페이지를 다운받으려면 URL을 IP주소로 변환하는 절차가 필요

콘텐츠 파서

  • 웹 페에지를 다운로드 하면 파싱 - 검증 절차를 거쳐야함.

중복된 콘텐츠?

  • 효과적인 방법은 웹페이지의 해시 값을 비교하는 것

콘텐츠 저장소

  • HTML 문서를 보관하는 시스템

  • 데이터양이 너무 많다 -> 디스크에 저장

  • 인기 있는 콘텐츠는 메모리에 두어 접근 지연 시간을 줄임

URL 추출기

  • HTML 페이지를 파싱하여 링크를 골라내는 역할

URL 필터

  • 특정한 콘텐츠 타입이나 파일 확장자를 갖는 URL,

  • 접속시 오류가 발생하는 URL ,

  • 접근 제어 목록에 포함된 URL,

  • 크롤링 대상에서 배제하는 역할

이미 방문한 URL

  • 블룸 필터 or 해시 테이블 을 통해서 이미 방문한 URL을 판단

URL 저장소

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

3. 상세 설계

DFS vs BFS

  • Depth First Search, Breath First Search

  • DFS는 좋은 선택이 아닐 가능성이 높다.

    • 왜?

    • 어느 정도로 깊숙이 가게 될지 가늠하기 어려워서

  • 그러므로 BFS 대부분 사용

    • BFS는 FIFO 큐를 사용하는 알고리즘

    • 이 큐 한쪽으로는 탐색할 URL을 집어넣고, 한쪽은 꺼내기만 하면 됨.

  • 표준적인 BFS는 URL간에 우선순위를 두지 않암.

    • 처리 순서에 있어서 모든 페이지를 공평하게 대우

    • 하지만 모든 웹 페이지가 같은 품질, 같은 수준의 중요성은 아님.

    • 그러므로 우선순위를 두는 것이 타당 (사용자 트래팩의 양, 업데이트 빈도 등)

미수집 URL 저장소 ![[Pasted image 20250928162248.png]]

  • 잘 이해 안됨.

HTML 다운로더

  • Robots.txt

  • 성능 최적화

    • 분산 크롤링

    • 도메인 이름 변환 결과 캐시

      • DNS Resolver는 보통 병목 중 하나 (10ms ~ 200ms)

    • 지역성

      • 크롤링 작업을 수행하는 서버를 지역별로 분산

    • 짦은 타임아웃

      • 서버가 응답하지 않으면 크롤러는 해당 페이지를 다운로드 중단하고 다음 페이지로 넘어가도록

  • 안정성

    • 안정해시

    • 크롤링 상태 및 수집 데이터 저장

    • 예외 처리

    • 데이터 검증

  • 확장성

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

  • 중복 콘텐츠

    • 해시, check-sum 사용

  • 거미 덫

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

    • 이를 자동으로 피해가는 알고리즘을 만들어내는 것은 까다로움

  • 데이터 노이즈

    • 가치 없는 콘텐츠는 제외한다.

4. 마무리

  • server-side rendering

    • 많은 웹사이트가 자바스크립트 기술을 사용해서 링크를 즉석에서 만들어냄.

    • 그러므로 있는 그대로 웹페이지를 다운 받는 다면 동적으로 생성되는 링크를 발견 못함.

  • 원치 않는 페이지 필터링

    • 스팽 방지 컴포넌트 두는게 좋음

  • 데이터베이스 다중화 및 샤딩

    • 가용성, 규모 확장성, 안정성이 향상됨.

  • 수평적 규모 확장성

    • 다운로드를 실행 할 서버가 수백 혹은 수천대 필요하게 될 수도 있음.

    • Stateless 서버로 만들어서, 규모 확장성이 가능하도록 한다.

참고

  • https://gngsn.tistory.com/201

  • https://redis.io/docs/latest/develop/data-types/probabilistic/bloom-filter/

Last updated

Was this helpful?