9장 웹 로봇
1. 크롤러와 크롤링
웹 크롤러
란? 웹페이지를 한 개 가져오고, 그 다음 그 페이지가 가리키는 모든 웹페이지를 가져오는 작업을 재귀적으로 반복하는 방식으로 웹을 순회하는 로봇이다.- 인터넷 검색엔진은 웹을 돌아다니면서 모든 문서를 끌어오기 위해 크롤러를 사용한다.
- 사용자가 특정 단어로 검색을 할때, 가져와야 하는 페이지들이 수십억 개나 되므로, 검색엔진 로봇들은 가장 복잡한 로봇들중 하나가 되었다.
1.1 어디에서 시작하는가: ‘루트 집합’
- 크롤러가 방문을 시작하는 URL들의 초기 집합을
루트 집합
이라고 한다. - 모든 링크를 크롤링하면 관심있는 웹페이지들의 대부분을 가져오게 될 수 있도록 충분히 다른 장소에서 URL들을 선택해야 한다.
- 일반적으로 좋은 루트 집합은 크고 인기 있는 웹 사이트, 새로 생성된 페이지들의 목록, 자주 링크되지 않는 잘 알려지 있지 않은 페이지들의 목록으로 구성된다.
1.2 링크 추출과 상대 링크 정상화
- 크롤러는 검색한 각 페이지 안에서 크롤링할 URL 링크들을 추가한다.
- HTML 파싱을 해서 링크들을 추출하고 상대 링크를 절대 링크로 바꿔야 하낟.
1.3 루프와 중복
- 순환은 크롤러를 루프에 빠뜨려서 빙빙 돌게 만들거나, 같은 페이지를 반복해서 가져오는데 시간을 허비하도록 만들 수 있다.
- 같은 페이지를 반복해서 가져오면, 웹 서버에 부담이 가고, 웹 사이트를 압박하여 실제 사용자도 사이트에 접근할 수 없도록 막아버리게 만들 수 도 있다.
- 크롤러는 루프 자체가 문제가 되지 않더라도, 많은 중복된 페이지들을 가져오게 되므로, 애플리케이션이 중복된 컨텐츠로 넘쳐나게 만들수 있다.
1.5 빵 부스러기의 흔적
- 전 세계 웹 콘텐츠들을 크롤링하기 위해서는 빠른 속도가 중요하다.
- 웹 크롤러들은 방문한 곳을 관리하기 위해 사용하는 유용한 기법들이 있다.
트리와 해시 테이블
- 복잡한 로봇들은 방문한 URL을 추적하기 위해 검색 트리나 해시 테이블을 사용한다.
느슨한 존재 비트맵
- 공간 사용을 최소화하기 위해 존재 비트 배열과 같은 느슨한 자료구조를 사용한다.
체크포인트
- 로봇 프로그램이 갑작스럽게 중단될 경우를 대비해, 방문한 URL의 목록이 디스크에 저장되었는지 확인한다.
파티셔닝
- 각각이 분리된 한 대의 컴퓨터인 로봇들이 동시에 일하고 있는
농장(farm)
을 이용한다. - 각 로봇엔 URL들의 특정
한 부분
이 할당되어 그에 대한 책임을 갖는다.
2. 로봇의 HTTP
- 로봇들은 HTTP 요청을 만들고 스스로를 클라이언트로서 적절한 HTTP 요청 헤더를 사용해야 한다.
2.1 요청 헤더 식별하기
- 로봇 대부분은 약간의 신원 식별 헤더(능력, 신원, 출신)를 구현하고 전송한다.
- 이 정보들은 크롤러의 소유자를 찾아낼 때와 서버에게 로봇이 어떤 종류의 콘텐츠를 다룰 수 있는지에 대한 약간의 정보를 주려 할 때 유용하다.
User-Agent
- 서버에게 요청을 만든 로봇의 이름
From
- 로봇의 사용자/관리자의 이메일 주소를 제공한다.
Accept
- 서버에게 어떤 미디어 타입을 보내도 되는지 말해준다.
Referer
- 현재의 요청 URL을 포함한 문서의 URL을 제공한다.
2.2 가상 호스팅
- 로봇은 Host 헤더를 지원해야 한다.
- 요청에 Host 헤더를 포함 하지 않으면 로봇이 어떤 URL에 대해 잘못된 콘텐츠를 찾게된다.
2.3 조건부 요청
- 수십억 개의 웹페이지를 다운 받을 수 도 있으므로, 콘텐츠가 변경되었을때만 가져오도록 하는 것이 효과적이다.
- 시간이나 엔터티 태그를 비교함으로써 그들이 받아간 마지막 버전 이후에 업데이트 된 것이 있는지 알아보는 조건부 HTTP요청을 구현한다.
2.4 응답 다루기
- 로봇들은 주 관심사가 단순히 GET 메서드로 콘텐츠를 요청해서 가져오는 것이므로
응답다루기
를 거의 하지 않는다. - 로봇들은 최소한 일반적인
상태 코드
나 예상할 수 있는상태 코드
를 다룰 수 있어야한다. - HTTP 헤더에 임베딩된 정보를 따라 로봇들은 엔터티 자체의 정보를 찾을 수 있다.
- 메타
http-equiv
태그와 같은 메타 HTML 태그는 리소스에 대해 콘텐츠 저자가 포함시킨 정보다.
2.5 User-Agent 타기팅
- 웹 사이트들은 그들의 여러 기능을 지원할 수 있도록 브라우저의 종류를 감지하여 그에 맞게 콘텐츠를 최적화한다.
- 사이트는 로봇에게 콘텐츠 대신 에러 페이지를 제공한다.
3. 부적절하게 동작하는 로봇들
폭주하는 로봇
- 로봇이 논리적인 에러를 갖고 있거나 순환에 빠졌다면 웹 서버에 극심한 부하를 안겨준다.
- 서버에 과부하를 유발하여 다른 누구에게도 서비스를 못하게 만드는 일이 발생할 수 있다.
오래된 URL
- 웹 사이트의 콘텐츠들이 많이 바뀌었다면, 로봇들은 존재하지 않은 URL에 대한 요청을 많이 보낼 수 있다.
- 존재하지 않는 문서에 대한 접근 요청이나, 에러 페이지를 제공하는 부하로 인해 웹 서버의 수용 능력이 감소될 수 있다.
길고 잘못된 URL
- 웹 사이트에게 크고 의미 없는 URL을 요청한다면, 웹 서버의 처리 능력에 영향을 주고, 접근 로그를 어지럽게 채우게 된다.
호기심이 지나친 로봇
- 로봇들은
사적인 데이터
에 대한 URL을 얻어 인터넷 검색엔진이나 기타 애플리케이션을 통해 쉽게 접근할 수 있도록 만들 수 있다. - 로봇들이 비밀번호 파일이나 신용카드 정보와 같이 민감한 데이터를 가져가는 것이 가능하다는 것을 사이트 구현자들이 인지해야 할 필요가 있다.
동적 게이트웨이 접근
- 로봇은 게이트웨이의 콘텐츠에 대한 URL로 요청을 할 수 있다.
- 보통 특수 목적을 위한 경우이므로 처리 비용이 많이 든다.
4. 로봇 차단하기
- robots.txt 는 로봇의 접근을 제어하는 정보를 저장하는 파일의 이름이다.
- 어떤 로봇이 서버의 어떤 부분에 접근할 수 있는지에 대한 정보가 담겨있다.
- 웹 사이트의 어떤 리소스에 접근하기 전에 해당 사이트의 robots.txt를 요청하고, 해당 사이트의 웹 페이지를 가져올 수 잇는 권한이 있는지 확인하고 페이지를 가져온다.
4.1 웹 사이트와 robots.txt 파일들
- 웹 사이트의 어떤 URL을 방문하기 전에, 해당 사이트에 robots.txt 파일이 존재한다면 로봇은 반드시 그 파일을 가져와서 처리해야 한다.
4.2 robots.txt 파일 포맷
User-Agent: Slurp
User-Agent: webcrawler
Disallow: /private
User-Agent: *
Disallow:
- 각 레코드는 특정 로봇들의 집합에 대한 차단 규칙의 집합을 기술한다.
- 각 레코드는 규칙 줄들의 집합으로 되어 있으며 빈 줄이나 파일 끝 문자로 끝난다.
User-Agent
- 로봇의 이름은 로봇의 HTTP GET 요청 안의 User-Agent헤더를 통해 보내진다.
- 로봇이 자신의 이름에 대응하는 User-Agent줄을 찾지 못하였고 와일드 카드를 사용한
User-Agent: *
줄도 찾지 못했다면, 대응하는 레코드가 없는것이므로, 접근에는 어떤 제한도 없다.
Disallow & Allow
User-Agent 줄 바로 다음에 온다.
특정 로봇에 대해 어떤 URL 경로가 명시적으로 금지되어 있고 명시적으로 허용되는지 기술한다.
5. 검색엔진
웹 로봇은 인터넷 검색엔진에서 사용자들이 어떠한 문서라도 찾을 수 있도록 도와준다.
5.1 검색 과정
- 검색엔진들은 전 세계의 웹페이지들에 대해
풀 텍스트 색인(full-text indexes)
라고 하는 로컬 데이터베이스를 생성한다. - 검색엔진 크롤러들은 웹페이지들을 수집하여 풀 텍스트 색인에 추가한다.
- 크롤링을 한 번 하는데 걸리는 시간이 상당한 데 비해 웹페이지륻은 매 순간 변화하기 때문에, 풀 텍스트 색인은 웹의 특정 순간에 대한 스냅숏에 불과하다.
- 풀 텍스트 색인은 단어 하나를 입력받아 그 단어를 포함하고 있는 문서를 즉각 알려줄 수 있는 데이터베이스이다.
- 사용자가 질의를 보내고나면 게이트웨이 프로그램은 웹 UI질의를 풀 텍스트 색인을 검색할 때 ㅅ용되는 표현식으로 변환한다.
- 질의의 결과를 확인하기 위해 검색엔진이 색인을 한번 사용했다면, 게이트웨이 애플리케이션은 그 결과를 이용해 최종 사용자를 위한 결과 페이지를 즉석에서 만들어낸다.