Web Crawler의 정의
웹 크롤러는 spider, spiderbot이라고도 불리며 웹을 탐색하는 application이다. 웹 검색 엔진 구축을 위해 indexing 목적으로 사용되는게 일반적이다.
A Web crawler, sometimes called a spider or spiderbot and often shortened to crawler, is an Internet bot that systematically browses the World Wide Web, typically operated by search engines for the purpose of Web indexing (web spidering).
https://en.wikipedia.org/wiki/Web_crawler
- Web Crawler는 특정 페이지에 접속해 원하는 데이터만 추출하는 기능에 집중된 Scraper와 유사하다. 하지만, 크롤링할 대상의 규모가 크기 때문에 몇가지 문제점을 추가로 가지고 있다.
- 가장 큰 문제는 순수히 Web의 방대한 양이다. 양을 측정하기 힘들며, 매 순간 증가하고 있다.
- web pages는 보통 검색 엔진이 통제하는 것이 아니다. 그래서 특정 도메인의 정보를 알 수 없는 경우가 있고 도메인 주인이 data를 공유하고 싶지 않을 수도 있는 한계가 있다.
- 이런 문제점들을 해결하기 위해 고려해야할 사항들이 많다. 그 중 생각나는 일부는 아래와 같다.
- 웹 규모를 고려한 대용량 저장소
- 수많은 URL을 방문하기 위한 병렬구조 (다중 thread 등)
- 방문이 불필요한 URL을 판단할 수 있는 로직 (중복 제거, 재방문 주기 로직 등)
- 다양한 형태의 웹페이지를 수집할 수 있는 로직 (form results, javascript로 구성된 scripted pages 등)
- 크롤링 target 서버에게 무리를 주지 않기 위한 로직(politeness policy, robot exclusion protocol 등)
- 다양한 Encoding 지원
몇몇 논문과 도서와 오픈소스 웹 크롤러인 Apache Nutch를 보면 Web Crawler의 구조를 살펴볼 수 있다. 아주 오래 전에 설계되어 현재 상용 크롤러에선 어떤 구조를 가지고 있을지 상상하기 어렵다. 하지만, 아래 논문과 도서 등에서 확인한 구조는 명칭은 다르지만 모두 유사한 구조를 가지고 있다. 이 중 이 글에선 Apache Nutch의 구조를 간략하게 공유하고자 한다.
https://courses.cs.washington.edu/courses/cse454/15wi/papers/mercator.pdf
https://ciir.cs.umass.edu/downloads/SEIRiP.pdf
Apache Nutch(Web Crawler)의 구조
Apache Nutch는 다양한 기능과 클래스를 제공하는데, 이 중 크게 5가지 Process가 반복하며 크롤링이 진행된다. (아래 그림 참조)
Inject
- Seed URLs -> CrawlDB
- Inject는 Text 파일 형태의 Seed URL을 Nutch가 URL을 관리하기 위한 메타데이터 저장소에 추가하는 작업을 한다. 크롤링의 시작 URL 역할을 하며 크롤링 중간에 새로운 URL을 강제적으로 주입시키는 역할도 한다.
Seed URL
Apache Nutch는 text 파일 형태로 해당 리스트를 가지고 있다. Seed URL을 인식하는 Process는 아래와 같다.
1. Apache Nutch는 Seed URL을 저장하는 directory에 있는 모든 text 파일을 연다.
2. line 단위로 불러와 URL을 읽어들인다.
3. ## 으로 시작하는 line과 빈 line은 인식하지 않는다.
아래는 예시로 Seed URL 텍스트 파일을 하나 작성한 것이다.
## 이 라인은 주식으로 사용됩니다
## 너치
http://nutch.apache.org/
## 카프카
https://kafka.apache.org/
## 하둡
https://hadoop.apache.org/
CrawlDB
CrawlDB는 Apache Nutch가 크롤링을 위해 관리하는 URL 메타정보를 쌓기위한 DB이다. 해당 DB는 HDFS (Hadoop Distributed File System) 형태로 저장되어 있으며 압축되어 저장된다. 단순히 CrawlDB 관련 파일을 열면 아래와 같이 알아 볼 수 없는 형태로 되어 있다.
Apache Nutch가 제공하는 ReadDB 클래스를 사용하면 사람이 읽을 수 있는 text 파일 형태로 변형하여 볼 수 있다. 아래는 결과 파일이다.
Generate
CrawlDB에 저장된 URL 중 1 cycle (inject→generate→fetch→parse→dbupdate)에 방문할 URL n개를 추출하는 역할을 한다. 이렇게 추출된 URL은 generated URL이라고 부르며 Segment라는 단위로 저장된다.
Segment는 readSeg 클래스를 활용하면 해당 파일 내부를 볼 수 있다.
아래 그림은 generate된 상태에서 readSeg 클래스를 활용하여 내부를 본 결과이다.
Fetch
Generated된 URL을 방문하여 HTML Raw 파일을 다운받는 역할을 한다. 마찬가지로 segment 단위로 저장되며 readSeg를 통해 아래와 같이 파일 내부를 확인할 수 있다
Parse
Fetched된 HTML 파일을 link, text, metadata로 분리하여 나누어 저장하는 역할을 한다. 아래 그림을 참조하면 도움이 될 것이다.
DBUpdate
segment에 추가된 새로운 데이터를 crawlDB에 추가한다. Apache Nutch는 기존 URL들과 새로운 URL을 합쳐 score, 크롤링 시각, signature(중복 판단을 위한) 등의 정보를 저장한다. 아래는 readDB 메서드를 활용하여 내부를 확인한 결과이다.
여기까지 간단한 크롤러의 정의와 Apache Nutch의 구조에 대한 설명을 했다. 추후에 Apache Nutch를 실행하는 2가지 모드, 특정 상항에 필요한 적절한 설정방법 등을 소개하도록 하겠다.
'아파치 너치(Apache Nutch)' 카테고리의 다른 글
Apache Nutch Single Mode 크롤링 (0) | 2021.06.29 |
---|