웹 크롤러는 로봇(robot) 또는 스파이더(spider)라고도 부른다.
검색 엔진에서 널리 쓰는 기술로, 웹에 새로 올라오거나 갱신된 콘텐츠를 찾아내는 것이 주된 목적이다.
웹 크롤러는 몇 개의 웹 페이지에서 시작하여 그 링크를 따라 나가면서 새로운 콘텐츠를 수집한다.
검색 엔진 인덱싱
크롤러는 웹 페이지를 모아 검색 엔진을 위한 로컬 인덱스를 만든다.
웹 아카이빙
나중에 사용할 목적으로 장기보관하기 위해 웹에서 정보를 모으는 절차를 말한다.
웹 마이닝
웹 마이닝을 통해 인터넷에서 유용한 지식을 도출해낸다. 일례로, 유명 금융 그룹들은 크롤러를 사용해 주주 총회 자료나 연차 보고서를 다운받아 기업의 핵심 사업 방향을 알아낸다.
웹 모니터링
크롤러를 사용하면 인터넷에서 저작권이나 상표권이 침해되는 사례를 모니터링할 수 있다.
웹 크롤러가 처리해야 하는 데이터의 규모에 따라 복잡도가 달라지므로 설계할 웹 크롤러가 감당해야 하는 데이터의 규모와 기능들을 알아내야 한다.

각 컴포넌트를 살펴보자.
웹 크롤러가 크롤링을 시작하는 출발점이다.
예시로 어떤 대학의 도메인 이름이 붙은 모든 페이지의 URL을 시작 URL로 사용하면, 해당 대학 웹사이트로부터 찾아 나갈 수 있는 모든 웹페이지를 크롤링할 수 있다.
전체 웹을 크롤링해야하는 경우, 가능한 한 많은 링크를 탐색할 수 있도록 하는 URL을 고르는 것이 바람직하다.
일반적으로 전체 URL 공간을 작은 부분집합으로 나누는 전략을 쓰거나 주제별로 다른 시작 URL을 사용한다.
대부분의 현대적 웹 크롤러는 크롤링 상태를
다운로드 할 URL, 다운로드 된 URL 로 나눠서 관리한다.
이 중 다운로드 할 URL을 저장 관리하는 컴포넌트를 미수집 URL 저장소라고 부른다.
미수집 URL 저장소에서 제공하는 다운로드할 URL을 이용하여 인터넷에서 웹 페이지를 다운로드하는 컴포넌트다.
HTML 다운로더는 웹 페이지를 다운받기 위해 도메인 이름 변환기를 사용하여 URL에 대응되는 IP 주소를 알아낸다.
이상한 웹 페이지는 문제를 일으킬 수 있는데다 저장 공간만 낭비하기 때문에 웹 페이지를 다운로드하면 파싱과 검증 절차를 걸쳐야 한다.
웹에 공개된 연구결과에 따르면, 29% 가량의 웹 페이지 컨텐츠는 중복이다.
본 설계안에서는 이미 시스템에 저장된 컨텐츠임을 알아내기 쉽게 하기 위해 자료구조를 도입한다.
저장할 데이터의 유형, 크기, 저장소 접근 빈도, 데이터의 유효 기간 등을 종합적으로 고려하여 저장소를 구현하는 데 쓰일 기술을 골라야 한다.
HTML 페이지를 파싱하여 링크들을 골라내는 역할을 한다.
크롤링 대상에서 아래와 같은 URL을 배제한다.
이미 방문한 URL이나 미수집 URL 저장소에 보관된 URL을 추적할 수 있게 하는 자료구조를 사용한다.
해당 자료 구조로는 블룸 필터나 해시 테이블이 널리 쓰인다.
이미 방문한 URL을 보관하는 저장소다.

웹은 페이지가 노드이고, 하이퍼링크는 에지인 유향 그래프와 같다.
크롤링은 그래프를 탐색하는 과정이라고 볼 수 있다.
그래프 탐색에 널리 쓰이는 알고리즘에는 DFS와 BFS가 있다.
하지만 DFS, 즉 깊이 우선 탐색은 그래프 크기가 클 경우 어느 정도로 깊숙이 가게 될지 가늠하기 어려워 좋은 선택이 아니다.
따라서 웹 크롤러는 보통 BFS를 사용한다. 큐를 사용하여 한쪽으로는 탐색할 URL을 집어넣고, 다른 한 쪽으로는 꺼내기만 한다.
하지만 이 구현법에는 두 가지 문제점이 있다.
한 페이지에서 나오는 링크의 상당수는 같은 서버로 되돌아간다.
크롤러는 같은 호스트에 속한 많은 링크를 병렬적으로 다운받아 한 서버로 수많은 요청이 가게되는데, 이는 politeness를 위배한다.
우선순위가 없다.
페이지 순위, 사용자 트래픽의 양, 업데이트 빈도 등 여러가지 척도에 비추어 구현하려면 표준적 알고리즘만 사용해서는 안된다.
미수집 URL 저장소를 잘 구현하면 politeness 를 갖추면서, 우선순위를 구별하는 크롤러를 구현할 수 있다.
예의 바른 크롤러가 지켜야할 원칙은, 동일 웹사이트에 대해서는 한 번에 한 페이지만 요청한다는 것이다.
웹사이트의 호스트명과 다운로드를 수행하는 작업 스레드 사이의 관계를 유지하면 된다. 각 다운로드 스레드는 별도 FIFO 큐를 가지고 있어서 해당 큐에서 꺼낸 URL 만 다운로드 한다.
페이지 랭크, 트래픽 양, 갱신 빈도 등 다양한 척도를 사용하여 유용성에 따라 URL의 우선순위를 나눌 수 있다.
큐에 URL을 저장하기 전에 prioritizer(순위 결정 장치) 를 거치도록 설계를 변경한다.

웹 페이지의 신선함을 유지하기 위해서는 이미 다운로드한 페이지라고 해도 주기적으로 재수집할 필요가 있다. 이 작업을 최적화하기 위한 전략으로는 다음과 같은 방버이 있다.
검색 엔진을 위한 크롤러는 수억개에 달하는 URL을 처리한다.
그 URL들을 어디에 저장해야할까?
메모리의 경우, 안정성과 규모 확장성이 떨어진다.
디스크의 경우, 느려서 쉽게 성능 병목지점이 된다.
절충안으로, 대부분의 URL은 디스크에 두지만 메모리 버퍼에 큐를 둔다. 버퍼에 있는 데이터는 주기적으로 디스크에 기록한다.
HTTP 프로토콜을 통해 웹 페이지를 내려 받는다.
로봇 제외 프로토콜이라고 부르기도 하는 Robots.txt는 웹 사이트가 크롤러와 소통하는 표준적 방법이다.
웹 사이트를 긁어 가기 전에 크롤러는 해당 파일에 나열된 규칙을 먼저 확인해야 한다.
HTML 다운로더에 사용할 수 있는 성능 최적화 기법들을 알아보자.
시스템 안정성을 향상시키기 위한 몇가지 접근법이 있다.
설계할 때는 새로운 형태의 컨텐츠를 쉽게 지원할 수 있도록 신경 써야 한다.
중복 콘텐츠
해시나 체크섬을 사용하면 중복 콘텐츠를 보다 쉽게 탐지할 수 있다.
거미 덫
크롤러를 무한 루프에 빠뜨리도록 설계한 웹 페이지를 말한다.
URL의 최대 길이를 제한하여 해결할 수 있지만 모든 경우를 다 피할 수는 없다.
따라서, 사람이 수작업으로 찾아낸 후 이런 사이트를 크롤러 탐색 대상에서 제외하거나 URL 필터 목록에 걸어둔다.
데이터 노이즈
광고나 스크립트 코드, 스팸 URL 같은 것은 가치가 없는 콘텐츠이다. 이런 콘텐츠는 가능하다면 제외해야 한다.
서버 측 렌더링
동적으로 생성되는 링크는 발견할 수 없다. 이 문제는 페이지를 파싱하기 전에 서버 측 렌더링을 적용하면 해결할 수 있다.
윈치 않는 페이지 필터링
스팸 방지 컴포넌트를 두어 품질이 조약하거나 스팸성인 페이지를 걸러내도록 하면 좋다
데이터베이스 다중화 및 샤딩: 데이터 계층 가용성, 규모확장성, 안정성을 향상시킬 수 있다.
수평적 규모 확장성
대규모 분산 다운로드 서버로 확장하기 위해 무상태 서버로 만들 필요가 있다.
가용성, 일관성, 안정성
성공적인 대형 시스템을 만들기 위해 필수적으로 고려되어야 한다.
데이터 분석 솔루션
시스템을 세밀히 조정하기 위해서는 데이터와 그 분석 결과가 필수적이다.
출처
가상 면접 사례로 배우는 대규모 시스템 설계 기초(알렉스 쉬 지음 | 이병준 옮김)