9. 웹 크롤러

💬 웹 크롤러란

  • 검색 엔진에서 널리 쓰는 기술로, 웹에 새로 올라오거나 갱신된 콘텐츠를 찾아내 수집하는 목적으로 사용된다.

활용

  • 검색 엔진 인덱싱

    • 웹 페이지를 모아 검색 엔진을 위한 로컬 인덱스를 만든다.

    • Googlebot은 구글의 검색 엔진을 위한 웹 크롤러이다.

  • 웹 아카이빙

    • 장기 보관을 위해 웹에서 정보를 모으는 것

    • 국립 도서관들이 크롤러를 돌려 웹사이트를 아카이빙하기도 한다.

  • 웹 마이닝

    • 웹 사이트를 통해 데이터를 마이닝하여 유용한 지식을 도출해내는 것

  • 웹 모니터링

    • 저작권이나 상표권이 침해되는 사례를 모니터링하는 것

크롤러의 조건

  • 규모 확장성: 웹에는 수십억 개의 페이지가 존재한다. 따라서 병행성(parallelism)을 활용하여 효율적으로 웹 크롤링을 하면 좋다.

  • 안정성(robustness): 웹에는 잘못 작성된 HTML, 아무 반응이 없는 서버, 장애, 악성 코드가 붙어 있는 링크 등이 존재한다. 크롤러는 이런 비정상적 입력이나 환경에 잘 대응할 수 있어야 한다.

  • 예절(politeness): 수집 대상 웹 사이트에 짧은 시간 동안 너무 많은 요청을 보내서는 안 된다.

  • 확장성(extensibility): 새로운 형태의 콘텐츠를 지원하기가 쉬워야 한다. 이미지 파일 등을 크롤링해야 할 때에 시스템이 확장하기 쉬워야 한다.

💬 컴포넌트

시작 URL 집합

  • 크롤러가 가능한 한 많은 링크를 탐색할 수 있도록 URL을 골라야 한다.

  • 주제별로 세분화하여 서로 다른 시작 URL을 사용해도 된다.

미수집 URL 저장소

  • 이미 다운로드되지 않은 미수집 URL을 저장한다.

  • 동일 웹사이트에 대해서는 한 번에 한 페이지만 요청해야 한다.

  • 수많은 URL 데이터를 메모리에만 저장하면 안정성, 규모 확장성 측면에서 적합하지 않다. 대부분의 URL은 디스크에 저장하고 IO 비용을 줄이기 위해 메모리 버퍼에 큐를 두고 주기적으로 디스크에 기록되도록 해야 한다.

  • 큐 라우터를 통해 동일 호스트를 가진 URL은 항상 하나의 큐에 입력되도록 하고, 큐 선택기를 통해 스레드가 큐에 있던 URL을 하나 꺼내 수행하도록 할 수 있다. 작업 스레드는 URL을 다운받게 되고, 다음 작업을 진행하기 전 일정 시간동안 대기(delay) 시킬 수 있다.

  • URL 우선 순위

    • PageRank, 트래픽 양, 갱신 빈도 등의 기준을 통해 URL의 우선 순위를 결정할 수 있다.

    • 우선순위별로 큐를 할당하여 우선 순위가 높은 큐부터 큐 선택기가 선택할 수 있도록 한다.

    • 이렇게 우선순위를 기반으로 선택된 URL는 앞서 다뤘던 큐 라우터에 전달된다.

  • 재수집

    • 기존에 다운로드했던 URL도 업데이트될 수 있기 때문에 주기적으로 재수집할 필요가 있다.

    • 웹 페이지의 변경 이력을 활용하거나, 중요한 페이지는 우선 순위를 높여 자주 재수집되도록 해야 한다.

HTML 다운로더

  • 웹 페이지를 다운로드한다.

  • Robots.txt 파일에 수집 가능한 페이지 목록이 들어 있으므로 이 파일을 주기적으로 캐싱해 사용해야 한다.

  • 성능 최적화를 위한 기법은 다음과 같다.

    • 분산 크롤링

      • 여러 서버에 크롤링 작업을 분산

      • 각 서버는 여러 스레드 돌려 다운로드 작업 처리

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

      • 한 스레드에서 DNS 요청할 경우, 결과를 받기 전까지 다음 작업 진행이 불가능하다.

      • 크롤링 스레드 중 하나라도 이 작업을 하고 있으면 다른 스레드의 DNS 요청도 전부 블록되므로 병목 현상이 발생한다.

      • DNS 요청 처리는 보통 10ms~200ms 소요된다.

      • 캐시에 도메인 이름, IP 주소 보관해두고 주기적으로 갱신을 해주어야 한다.

    • 지역성을 활용해 크롤링 서버를 지역별로 분산시키고, 크롤링 서버는 지역적으로 가까운 크롤링 대상 서버를 다루도록 한다. 이를 통해 페이지 다운로드 시간을 절감할 수 있다.

    • timeout을 짧게 설정해 응답하지 않는 서버는 넘어가야 한다.

  • 안정성을 위해 다음 방법들을 활용할 수 있다.

    • consistent hashing 적용하여 다운로더 서버들에 들어가는 부하를 분산시킨다.

    • 장애가 발생해도 쉽게 복구할 수 있도록 데이터를 지속적 저장장치에 저장한다.

    • 예외가 발생해도 전체 시스템이 중단되지 않도록 예외 처리를 우아하게 해야 한다.

    • 시스템 오류를 방지하기 위해 데이터 검증을 해야 한다.

  • 확장성을 위해 새로운 형태의 콘텐츠를 지원하는 모듈을 쉽게 추가할 수 있어야 한다.

도메인 이름 변환기

  • URL을 IP 주소로 변환 후 데이터를 요청하기 위해 필요하다.

콘텐츠 파서

  • 웹 페이지 다운 시 파싱과 검증 절차를 거치도록 한다.

중복 컨텐츠

  • 데이터 중복을 줄이고 기존에 저장된 콘텐츠임을 쉽게 알아내야 한다.

  • 웹 페이지의 해시 값이나 체크섬을 이용해 비교하는 방법이 있다.

콘텐츠 저장소

  • HTML 문서를 보관한다.

  • 저장할 데이터의 유형, 크기, 접근 빈도, 유효 기간을 고려해야 한다.

  • 대부분의 콘텐츠는 디스크에 저장하고, 자주 접근되는 콘텐츠는 메모리에 둘 수 있다.

URL 추출기

  • HTML 페이지를 파싱해 URL을 추출한다.

  • 상대 경로는 절대 경로로 변환해 저장해야 한다.

URL 필터

  • 특정 콘텐츠 타입이나 파일 확장자를 갖는 URL, 접속 시 오류가 발생하는 URL, 접근 제외 목록에 포함된 URL 등을 크롤링 대상에서 제외한다.

  • 크롤러가 무한 루프에 빠질 수 있는 무한히 깊은 디렉토리 구조를 포함한 URL의 경우, URL의 최대 길이를 제한하거나 수작업으로 확인해 크롤링 대상에서 제외해야 한다.

방문 여부

  • URL에 이미 방문했는지, 이미 미수집 URL 저장소에 있는지 확인해야 한다.

  • 블룸 필터나 해시 테이블을 이용해 빠르게 탐지할 수 있다.

URL 저장소

  • 이미 방문한 URL을 저장한다.

Last updated