대규모 시스템 설계 기초 - 웹 크롤러 설계

Huisu·2025년 3월 18일
0

Article

목록 보기
9/9
post-thumbnail

웹 크롤계

개략적 설계

💬 웹 크롤러의 이용 식

웹 크롤러는 로봇 또는 스파이더라고도 불립니다. 검색 엔진에서 널리 쓰이는 기술로, 웹에 올라오거나 갱신된 콘텐츠를 찾아내는 것이 주된 목적입니다. 여기서 콘텐츠는 웹 페이지일 수도 있고, 이미지나 비디오 같은 정적 파일일 수도 있습니다. 크롤러는 아래와 같이 다양한 방면으로 이용될 수 있습니다.

  • 검색 엔진 인덱싱: 크롤러가 웹 페이지를 모아 검색 엔진을 위한 로컬 인덱스를 생성하는 것으로, 대표적인 예시인 Googlebot이 있다.
  • 웹 아카이빙: 나중에 사용할 목적으로 웹을 장기보관하기 위해 웹에서 정보를 모으는 절차이다.
  • 웹 마이닝: 데이터 마이닝 업계에 활용될 데이터를 모으기 위한 크롤링이다.
  • 웹 모니터링: 크롤러를 사용해 인터넷에서 저작권이나 상표권이 침해되는 사례를 모니터링할 수 있다.

💬 개략적 설계안 제시

시작 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 vs BFS

웹은 마치 유향 그래프와 같습니다. 페이지는 노드이고 하이퍼링크는 에지라고 보면 됩니다. 크롤링 프로세스는 이 유향 그래프를 따라 탐색하는 과정입니다. 여기서 선택지가 두 개 존재하는데요, 바로 DFS와 BFS입니다.

하지만 DFS는 좋은 선택이 아닐 가능성이 높습니다. 그래프의 크기가 클 경우 어느 정도로 깊게 들어가야 할지 가늠이 어렵다는 문제점이 있기 때문입니다. 따라서 웹 크롤러는 BFS를 사용하는데, 이 구현법에서는 FIFO를 사용하기 때문에 발생하는 문제점이 있습니다.

  1. 한 페이지에서 나오는 링크의 상당수는 같은 페이지로 되돌아간다.

  2. 표준적 BFS 알고리즘은 URL 간의 우선 순위를 두지 않는다.

💬 미수집 URL 저장소

미수집 URL 저장소를 활용하면 이러한 문제점을 조금 더 쉽게 해결할 수 있습니다. 이 저장소를 잘 구현하면 무차별적인 요청을 보내지 않는 예의 있는 크롤러를 만들 수 있습니다. 여기서 말하는 예의란, 동일 웹 사이트에 대해서는 한 번에 한 페이지만 요청한다는 것입니다. 같은 웹 사이트의 페이지를 다운받는 태스크는 시간차를 두고 실행하도록 하는 것입니다. 즉 각 다운로드 스레드마다 FIFO 큐를 가지고 있어서, 해당 큐에서 꺼낸 URL만 다운로드하도록 하는 것입니다.

  • 순위결정장치: URL을 입력으로 받아 페이지 랭크, 트래픽 양, 갱신 빈도 등을 척도로 우선순위를 계산합니다.
  • 전면 큐 선택기: 처리할 URL을 꺼내는 역할을 하며, 높은 우선순위의 큐에서 더 자주 추출됩니다.
  • 후면 큐 라우터: 같은 호스트에 속한 URL은 언제나 같은 큐로 가도록 보장하는 역할을 합니다.
  • 후면 큐 선택기: 큐들을 순회하면서 큐에서 URL을 꺼내 다운로드하도록 작업 스레드에 저장합니다.
  • 작업 스레드: 전달받은 URL을 다운로드하는 작업을 수행합니다.

💬 HTML 다운로더

HTML 다운로더는 HTTP 프로토콜을 통해 웹 페이지를 내려받습니다. 다운로더에 대해 알아보기 전에 로봇 제외 프로토콜에 대해 먼저 이야기해 보겠습니다.

Robots.txt

로봇 제외 프로토콜이라고 부르기도 하는 Robots.txt는 웹사이트가 크롤러와 소통하는 표준적인 방법입니다. 이 파일에는 크롤러가 수집해도 되는 페이지 목록들이 들어 있습니다. 따라서 웹 사이트를 다운로드 하기 전에 해당 파일에 나열된 규칙들을 확인해야 합니다.

이제 다시 HTML 다운로드에 대해 이야기해 볼까요? HTML 다운로더를 설계할 때는 성능 최적화가 필수적입니다. 아래와 같은 성능 최적화 기법을 사용해 볼 수 있습니다.

성능 최적화

  1. 분산 크롤링: 성능을 높이기 위해 크롤링 작업을 여러 서버에 분산하는 방법입니다.
  2. 도메인 이름 변환 결과 캐시: DNS Resolver는 크롤러의 병목 원인 중 하나인데, 도메인 이름과 IP 주소 사이의 관계를 캐시에 보관해 두고 cron job을 통해 주기적으로 갱신하는 방법입니다.
  3. 지역성: 크롤링 작업을 수행하는 서버를 지역마다 분산하는 방법입니다.
  4. 짧은 타임아웃: 최대 얼마나 기다릴지를 미리 정해 두고 대기 시간을 줄이는 방법입니다.

💬 문제 있는 콘텐츠 감지 및 회략

중복된 웹 페이지거나 의미 없는 또는 유해한 콘텐츠를 어떻게 감지하고 시스템으로부터 차단할 수 있을까요?

❕중복 콘텐츠

해시나 체크섬을 사용하여 중복 콘텐츠의 다운로드를 회피합니다.

❕거미 덫

거미덫은 크롤러를 무한 루프에 빠뜨리도록 설계한 웹 페이지입니다. 예를 들어

sample.com/bar/foo/bar/foo/bar/foo/bar/foo/bar/foo/bar/foo/bar/foo/…

를 들 수 있습니다. 이런 덫은 URL의 최대 길이를 제한하면 회피할 수 있습니다. 하지만 요즈음의 URL은 정말 긴 경우도 많아서, 사람이 수작업으로 덫을 확인하고 찾아낸 후 거미덫 사이트를 크롤러 탐색에서 제외하는 방법을 사용합니다.

❕데이터 노이즈

광고나 스크립트 코드, 스팸 URL은 크롤러에게 도움되지 않기 떄문에 가능하다면 제외합니다.

0개의 댓글