웹 크롤러는 로봇 또는 스파이더라고도 불립니다. 검색 엔진에서 널리 쓰이는 기술로, 웹에 올라오거나 갱신된 콘텐츠를 찾아내는 것이 주된 목적입니다. 여기서 콘텐츠는 웹 페이지일 수도 있고, 이미지나 비디오 같은 정적 파일일 수도 있습니다. 크롤러는 아래와 같이 다양한 방면으로 이용될 수 있습니다.
❕시작 URL 집합
웹 크롤러가 크롤링을 시작하는 촐발점입니다.
❕미수집 URL 저장소
대부분의 현대적인 웹 크롤러는 크롤링 상태를 다운로드 할 URL과 다운로드된 URL 두 가지의 종류로 나눠 관리합니다. 이 중 다운로드 할 URL을 관리하는 컴포넌트를 미수집URL이라고 합니다. 편히 말해 Queue라고 생각하면 됩니다.
❕HTML 다운로더
HTML 다운로더는 인터넷에서 웹 페이지를 다운로드하는 컴포넌트입니다. 다운로드할 페이지의 URL은 미숮비 URL 저장소가 제공합니다.
❕도메인 이름 변환기
웹 페이지를 다운받으려면 URL을 IP 주소로 변환하는 절차가 필요합니다. HTML 다운로더는 도메인 이름 변환기를 사용해서 URL 주소에 대응되는 IP 주소를 알아냅니다.
❕콘텐츠 파서
웹 페이지를 다운로드하면 파싱과 검증 절차를 거쳐야 합니다. 이상한 웹 페이지를 다운로드했다가 문제가 발생할 수도 있고, 저장 공간을 낭비할 수도 있기 때문입니다. 크롤링 서버 안에 파서를 구현하면 크롤링 과정이 너무 느려지기 때문에, 독립된 컴포넌트로 구현합니다.
❕중복 콘텐츠인가?
중복된 웹 페이지에 대한 크롤링 작업을 줄이기 위해 자료 구졸르 도입하여 데이터 처리 소요 시간을 감소시킨다. 두 HTML 문서를 비교하는 게 가장 간단하겠지만 문서가 많고 클 경우 느리고 비효율적이다. 효과적인 방법은 웹 페이지의 해시값을 비교하는 것이다.
❕콘텐츠 저장소
HTML 문서를 보관하는 시스템이다. 데이터의 양이 너무 많기 떄문에 대부분의 콘텐츠는 디스크에 저장한다. 하지만 인기 있는 콘텐츠는 메모리에 두어 접근 지연 시간을 줄인다.
❕URL 추출기
HTML을 파싱하여 링크들을 골라내는 역할을 한다. 즉, < a > 태그에 있는 링크들을 절대 경로로 바꾸어 저장하는 것이다.
❕URL 필터
URL 필터는 특정한 콘텐츠 타입이나 파일 확장자를 갖는 URL, 접속 시 오류가 발생하는 URL, 접근 제외 목록에 포함된 URL 등을 크롤링 대상에서 배제하는 역할을 합니다.
❕이미 방문한 URL?
이 단계를 구현하기 위해서는 이미 방문한 URL이나 미수집URL 저장소에 보관된 URL을 추적할 수 있도록 해야 합니다. 이를 위해서 블룸 필터나 해시 테이블이 널리 사용됩니다.
❕URL 저장소
이미 방문한 URL을 보관하는 저장소입니다.세 설계
웹은 마치 유향 그래프와 같습니다. 페이지는 노드이고 하이퍼링크는 에지라고 보면 됩니다. 크롤링 프로세스는 이 유향 그래프를 따라 탐색하는 과정입니다. 여기서 선택지가 두 개 존재하는데요, 바로 DFS와 BFS입니다.
하지만 DFS는 좋은 선택이 아닐 가능성이 높습니다. 그래프의 크기가 클 경우 어느 정도로 깊게 들어가야 할지 가늠이 어렵다는 문제점이 있기 때문입니다. 따라서 웹 크롤러는 BFS를 사용하는데, 이 구현법에서는 FIFO를 사용하기 때문에 발생하는 문제점이 있습니다.
한 페이지에서 나오는 링크의 상당수는 같은 페이지로 되돌아간다.
표준적 BFS 알고리즘은 URL 간의 우선 순위를 두지 않는다.
미수집 URL 저장소를 활용하면 이러한 문제점을 조금 더 쉽게 해결할 수 있습니다. 이 저장소를 잘 구현하면 무차별적인 요청을 보내지 않는 예의 있는 크롤러를 만들 수 있습니다. 여기서 말하는 예의란, 동일 웹 사이트에 대해서는 한 번에 한 페이지만 요청한다는 것입니다. 같은 웹 사이트의 페이지를 다운받는 태스크는 시간차를 두고 실행하도록 하는 것입니다. 즉 각 다운로드 스레드마다 FIFO 큐를 가지고 있어서, 해당 큐에서 꺼낸 URL만 다운로드하도록 하는 것입니다.
HTML 다운로더는 HTTP 프로토콜을 통해 웹 페이지를 내려받습니다. 다운로더에 대해 알아보기 전에 로봇 제외 프로토콜에 대해 먼저 이야기해 보겠습니다.
❕Robots.txt
로봇 제외 프로토콜이라고 부르기도 하는 Robots.txt는 웹사이트가 크롤러와 소통하는 표준적인 방법입니다. 이 파일에는 크롤러가 수집해도 되는 페이지 목록들이 들어 있습니다. 따라서 웹 사이트를 다운로드 하기 전에 해당 파일에 나열된 규칙들을 확인해야 합니다.
이제 다시 HTML 다운로드에 대해 이야기해 볼까요? HTML 다운로더를 설계할 때는 성능 최적화가 필수적입니다. 아래와 같은 성능 최적화 기법을 사용해 볼 수 있습니다.
❕성능 최적화
중복된 웹 페이지거나 의미 없는 또는 유해한 콘텐츠를 어떻게 감지하고 시스템으로부터 차단할 수 있을까요?
❕중복 콘텐츠
해시나 체크섬을 사용하여 중복 콘텐츠의 다운로드를 회피합니다.
❕거미 덫
거미덫은 크롤러를 무한 루프에 빠뜨리도록 설계한 웹 페이지입니다. 예를 들어
sample.com/bar/foo/bar/foo/bar/foo/bar/foo/bar/foo/bar/foo/bar/foo/…
를 들 수 있습니다. 이런 덫은 URL의 최대 길이를 제한하면 회피할 수 있습니다. 하지만 요즈음의 URL은 정말 긴 경우도 많아서, 사람이 수작업으로 덫을 확인하고 찾아낸 후 거미덫 사이트를 크롤러 탐색에서 제외하는 방법을 사용합니다.
❕데이터 노이즈
광고나 스크립트 코드, 스팸 URL은 크롤러에게 도움되지 않기 떄문에 가능하다면 제외합니다.