9.1 크롤러와 크롤링
웹 크롤러는, 먼저 웹페이지를 한 개 가져오고, 그 다음 그 페이지가 가리키는 모든 웹페이지를 가져오고, 다시 그 페이지들이 가리키는 모든 웹페이지들을 가져오는 이러한 일을 재귀적으로 반복하는 방식으로 웹을 순화하는 로봇이다
9.1.1 어디에서 시작하는가: '루트 집합'
- 크롤러가 방문을 시작하는 URL들의초기 집합은 루트 집합이라고 한다.
- 루트 집합을 고를 때, 모든 링크를 크롤링하면 결과적으로 관심있는 웹페이지들의 대부분을 가져 오게 될 수 있도록 해야한다
9.1.2 링크 추출과 상태 링크 정상화
크롤러는 검색한 각 페이지 안에 들어있는 URL 링크들을 파싱해서 크롤링할 페이지들의 목록에 추가해야한다
9.1.3 순환 피하기
로봇들은 순환을 피하기 위해 반드시 그들이 어디를 방문했는 지 일아야 한다
9.1.4 루프와 중복
순환이 해로운 이유
- 순환은 크롤러를 루프에 빠트려서 꼼짝 못하게 할 수 있다
- 크롤러가 같은 페이지를 반복해서 가져오면 고스란히 웹 서버의 부담이 된다
- 루프 자체가 문제가 되지 않더라도, 크롤러는 많은 수의 중복된 페이지들을 가져오게 된다
9.1.5 빵 부스러기의 흔적
크롤러가 방문한 곳을 관리하기 위해 사용하는 기법들
- 트리와 해시 테이블 - 방문한 URL을 추적하기 위해 사용한다
- 느슨한 존재 비트맵 - 공간 사용을 최소화하기 위해 존재 비트 배열과 같은 자료구조를 사용한다
- 체크포인트 - 로봇이 갑자기 중단될 경우를 대비해, 방문한 URL의 목록이 디스크에 저장되었는지 확인한다
- 파티셔닝 - 로봇들은 URL들의 특정 한 부분을 할당받아 일을 수행한다.
9.1.6 별칭(alias)과 로봇 순환
같은 URL을 가리키게 되는 경우
- 기본 포트가 80 일때
- %7F이 ~과 같을 때
- 태그에 따라 페이지가 바뀌지 않을 때
- 서버가 대소문자를 구분하지 않을 때
- 기본 페이지가 index.html일때
- www.foo.com이 이 아이피 주소를 가질 때
9.1.7 URL 정규화하기
웹 로봇이 URL을 표준 형식으로 '정규화'하는 예
- 포트 번호가 명시되지 않았다면, 호스트명에 :80 을 추가한다
- 모든 %xx 이스케이핑된 문자들을 대응되는 문자로 변환한다
- #태그들을 제거한다
9.1.8 파일 시스텝 링크 순환
파일 시스템의 심벌리 링크는 사실상 아무것도 존재하지 않으면서도 끝없이 깊어지는 디렉터리 계층을 만들 수 있기 때문에, 매우 교묘한 종류의 순환을 유발할 수 있다
9.1.9 동적 가상 웹 공간
9.1.10 루프와 중복 피하기
웹에서 로봇이 더 올바르게 동작하기 위해 사용하는 기법
- URL 정규화
- 너비 우선 크롤링
- 방문할 URL들을 웹 사이트들 전체에 걸쳐 너비 우선으로 스케쥴링하면, 순환의 영향을 최소화할 수 있다
- 스로틀링
- 로봇이 웹 사이트에서 일정 시간 동안 가져올 수 있는 페이지의 숫자 제한
- URL 크기 제한
- 일정 길이를 넘는 URL의 크롤링을 거부한다
- URL/사이트 블랙리스트
- 함정인 것으로 알려진 URL의 목록을 만들어 관리하고 피한다.
- 패턴 발견
- 반복되는 구성요소를 가진 URL을 잠재적인 순환으로 보고 , 둘 혹은 셋 이상의 반복된 구성요소를 갖고 있는 URL을 크롤링하는 것을 거절한다
- 콘텐츠 지문
- 콘텐츠 지문을 사용하는 로봇들은 페이지의 콘텐츠에서 몇 바이트를 얻어내어 체크섬을 계산한다
- 어떤 웹 서버들은 동적으로 페이지를 수정하기 때문에, 로봇들은 특정 부분들을 체크섬 계산에서 빠트린다
- 사람의 모니터링
9.2 로봇의 HTTP
9.2.1 요청 헤더 식별하기
- 로봇 구현자들은 로봇의 능력 신원 출신을 알려주는 기본적인 몇 가지 헤더를 사이트에게 보내준다
- 잘못된 크롤로의 소유자를 찾아낼 때와 서버에게 로봇이 어떤 종류의 콘텐츠를 다룰 수 있는지에대한 약간의 정보를 주려 할 때 사용한다
- 기본적인 식별 헤더 : User-Agent, From, Accpt, Referer
9.2.2 가상호스팅
- 요청에 Host헤더를 포함하지 않으면 로봇이 어떤 URL에 대해 잘못된 콘텐츠를 찾을수있다
- HTTP/1.1은 Host헤더를 사용할 것을 요구한다
9.2.3 조건부 요청
로봇 중 몇은 시간이나 엔터티 태그를 비교해 마지막 버전 이후에 업데이트 된 것 이 있는지 알아보는 조건부 HTTP 요청을 구현한다
9.2.4 응답 다루기
HTTP특정 몇몇 기능을 사용하는 로봇들이나, 웹 탐색이나 서버와의 상호작용을 더 잘 해보려고 하는 로봇들은 여러 종류의 HTTP응답을 다룰 줄 알아야한다
9.2.5 User-Agent 타기팅
많은 웹 사이트들은 그들의 여러 기능을 지원할 수 있도록 브라우저의 종류를 감지하여 그에 맞게 콘텐츠를 최적화한다.
9.3 부적절하게 동작하는 로봇들
로봇이 저지르는 실수들
- 폭주하는 로봇
- 로봇이 에러를 가지거나 순환에 빠질경우 서버에 과부하를 줄 수 있다
- 오래된 URL
- 존재하지 않는 문서에 대한 접근 요청으로 에러로그를 채우거나 에러 페이지를 제공하는 부하를 줄 수 있다
- 길고 잘못된 URL
- URL이 길 경우 웹 서버의 처리 능력에 영향을 준다
- 호기심이 지나친 로봇
- 어떤 로봇들은 사적인 데이터에 대한 URL을 얻어 그 데이터를 인터넷 검색엔진이나 기타 애플리케이션을 통해 접근할 수 있도록 만들 수 있다
- 동적 게이트웨이 접근
- 로봇은 게이트웨이 애플리케이션의 콘텐츠에 대한 URL로 요청할 수 있다. 이 경우 처리 비용이 많이 들 수 있다.
9.4 로봇 차단하기
9.4.1 로봇 차단 표준
로봇 차단 표준의 임시방편으로 마련된 표준으로, 오늘날 대부분의 로봇들은 v.0.0 이나 v.1.0을 채택하고있다
9.4.2 웹 사이트와 robots.txt
robots.txt 가져오기
- 로봇은 HTTP GET메서드를 이용해 robots.txt 리소스를 가져온다
- robots.txt가 존재하면 text/plain 본문으로 반환한다
응답 코드
- HTTP 상태 코드 200 : 그 응답의 콘텐츠를 파싱하여 차단 규칙을 얻어 따른다
- HTTP 상태 코드 404 : 차단 규칙이 없다고 가정하고 robots.txt의 제약 없이 접근한다
- HTTP 상태 코드 401, 403 : 접근이 완전히 제한되어있다
- HTTP 상태 코드 503 : 그 사이트의 리소스를 검색하는 것은 뒤로 미루어야 한다
- HTTP 상태 코드 3XX : 로봇은 리소스가 발견될 때까지 리다이렉트를 따라가야 한다
-
로봇은 자신이 이해하지 못하는 필드는 무시해야 한다
-
하위 호환성을 위해, 한 줄을 여러 줄로 나누어 적는 것은 허용되지 않는다
-
주석은 문자 #로 시작해서 그 뒤에 줄바꿈 문자가 나올 때까지 이어지는 주석 내용으로 이루어진다
-
버전 0.0은 Allow줄을 지원하지 않았다. 이런 경우 허용되는 URL도 탐색하지 않을 수 있다
-
로봇 META 태그는 다른 모든 HTML META태그와 마찬가지로 반드시 HTML 페이지의 HEAD섹션에 나타나야 한다
'Study' 카테고리의 다른 글
[HTTP 완벽가이드] 11장 : 클라이언트 식별과 쿠키 (0) | 2021.01.15 |
---|---|
[HTTP 완벽 가이드] 10장 : HTTP/2.0 (0) | 2021.01.14 |
[HTTP 완벽 가이드] 8장 : 통합점-게이트웨이, 터널, 릴레이 (0) | 2021.01.12 |
[HTTP 완벽 가이드] 7장 : 캐시 (0) | 2021.01.11 |
[HTTP 완벽 가이드] 6장 : 프락시 (0) | 2020.12.18 |