[2. HTTP 아키텍처] 9장) 웹 로봇
웹 로봇
: 사람과의 상호작용 없이 연속된 웹 트랜잭션들을 자동으로 수행하는 소프트웨어 프로그램
크롤러와 크롤링
- 웹 크롤러: 먼저 웹페이지를 한 개 가져오고 그 다음 그 페이지가 가리키는 모든 페이지를 가져오는 일을 재귀적으로 반복하는 방식으로 웹을 순회하는 로봇
- 루트 집합: 크롤러가 방문을 시작하는 URL들의 초기 집합
인터넷 검색엔진에서 쓰이는 것과 같은 많은 대규모 크롤러 제품들은 사용자들이 루트 집합에 새 페이지나 잘 알려지지 않은 페이지들을 추가하는 기능을 제공한다.
크롤러는 웹을 돌아다니면서 꾸준히 HTML 문서를 검색한다. 크롤러는 검색한 각 페이지 안에 들어있는 URL 링크들을 파싱해서 크롤링할 페이지들의 목록에 추가해야 한다.
또한, 로봇이 웹을 크롤링 할 때, 루프나 순환에 빠지지 않도록 조심해야 한다. 순환은 로봇을 함정에 빠뜨려서 멈추게 하거나 진행을 느려지게 한다.
- 순환은 크롤러를 루프에 빠뜨려서 꼼짝 못하게 만들 수 있다. 이러한 크롤러가 네트워크 대역폭을 차지하고 어떤 페이지도 가져올 수 없게 되어버릴 수 있다.
- 크롤러가 같은 페이지를 반복해서 가져오면 웹 서버에 부담이 되고, 이러한 서비스 방해 행위는 법적인 문제제기의 근거가 될 수 있다.
- 루프 자체가 문제되지 않더라도 크롤러는 많은 수의 중복된 페이지들을 가져오게 된다.
대규모 웹 크롤러가 그들이 방문한 곳을 관리하기 위해 사용하는 유용한 기법
- 트리와 해시 테이블
- 느슨한 존재 비트맵: 각 URL은 해시 함수에 의해 고정된 크기의 숫자로 변환되고 배열 안에 대응하는 '존재 비트'를 갖는다.
- 체크 포인트: 로봇 프로그램이 중단될 경우를 대비해, 방문한 URL의 목록이 저장되어 있는지 확인
- 파티셔닝: 대규모 웹 로봇은 각각이 분리된 한 대의 컴퓨터인 로봇들이 동시에 일하고 있는 '농장'을 이용한다.
별칭과 로봇 순환
: 한 URL이 또 다른 URL에 대한 별칭이라면, 둘이 달라보여도 사실은 같은 리소스를 가리키고 있다.
http://www.foo.com/bar.html | http://www.foo.com:80/bar.html | 기본 포트가 80번일 때, |
http://www.foo.com/~fred | http://www.foo.com/%7fred | %7F이 ~과 같을 때 |
http://www.foo.com/x.html#early | http://www.foo.com/x.html#middle | 태그에 따라 페이지가 바뀌지 않을 때 |
http://www.foo.com/ | http://www.foo.com/index.html | 기본 페이지가 index.html 일 때 |
서버가 대소문자를 구분하지 않을 때, 아이피 주소 등등..
URL 정규화하기
- 포트 번호가 명시되지 않았다면, 호스트 명에 ':80'을 추가한다.
- 모든 %xx 이스케이핑된 문자들을 대응되는 문자로 변환한다.
- #태그들을 제거한다.
루프와 중복 피하기
: 모든 순환을 피하는 완벽한 방법은 없다. 실제로 잘 설계된 로봇은 순환을 피하기 위해 휴리스틱의 집합을 필요로 한다.
ko.wikipedia.org/wiki/%ED%9C%B4%EB%A6%AC%EC%8A%A4%ED%8B%B1_%ED%95%A8%EC%88%98
휴리스틱 함수 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 휴리스틱 함수(heuristic function)는 가용한 정보를 기반으로 각 분기 단계에서 어느 한 분기를 선택하기 위해 사용하는 다양한 탐색 알고리즘의 대안 함수이다. 최
ko.wikipedia.org
- 웹에서 로봇이 올바르게 동작하기 위해 사용하는 기법
- URL 정규화
- 너비 우선 크롤링
- 스로틀링: 로봇이 웹 사이트에서 일정 시간 동안 가져올 수 있는 페이지의 숫자를 제한
- URL 크기 제한: 로봇은 일정 길이를 넘는 URL의 크롤링을 거부할 수 있다.
- URL/사이트 블랙리스트: 로봇 순환을 만들어 내거나 함정인 것으로 알려진 URL의 목록을 만들어 관리하고 피한다.
- 패턴 발견: 파일 시스템의 심벌릭 링크를 통한 순환과 비슷한 오설정들은 일정 패턴을 따르는 경향이 있다.
- 콘텐츠 지문: 지문은 페이지의 콘텐츠에서 몇 바이트를 얻어내어 체크섬을 계산한다.
- 사람의 모니터링
로봇의 HTTP
: 로봇 또한 HTTP 명세의 규칙을 지켜야 한다.
- 요청 헤더 식별하기
: 로봇의 능력, 신원, 출신을 알려주는 기본적인 몇 가지 헤더를 사이트에게 보내주는 것이 좋다.
- User-Agent: 서버에게 요청을 만든 로봇의 이름을 말해준다.
- From: 로봇의 사용자/관리자의 이메일 주소를 제공한다.
- Accept: 서버에게 어떤 미디어 타입을 보내도 되는지 말해준다. 관심있는 유형의 콘텐츠만 받게 될 것임을 확신하는데 도움을 줌
- Referer: 현재의 요청 URL을 포함한 문서의 URL 제공
- 가상 호스팅
: 로봇 구현자들은 host 헤더를 지원할 필요가 있다. 요청에 host 헤더를 포함하지 않으면 로봇이 어떤 URL에 대해 잘못된 콘텐츠를 찾게 만든다.
- 조건부 요청
: 수십억 개의 웹 페이지를 다운 받게 될 수 있는 인터넷 검색엔진 로봇과 같은 경우, 오직 변경되었을 때만 콘텐츠를 가져오도록 하는 것
- 응답 다루기
- 상태코드: 모든 로봇은 200 OK나 404 Not Found 같은 HTTP 상태 코드를 이해해야 한다.
- 엔터티: 헤더에 임베딩된 정보를 따라 로봇들은 엔터티 자체의 정보를 찾을 수 있다.
- user-agent 타기팅
: 웹 사이트들은 그들의 여러 기능을 지원할 수 있도록 브라우저의 종류를 감지하여 그에 맞게 콘텐츠를 최적화 한다.
부적절하게 동작하는 로봇들
- 폭주하는 로봇
: 로봇이 논리적인 에러를 갖고 있거나 순환에 빠지면 웹 서버에 부하를 안겨줄 수 있고 서버에 과부하를 유발하여 서비스를 못하게 만드는 일이 발생할 수 있다. 모든 로봇 저자들은 폭주 방지를 위한 보호 장치를 신경써서 설계해야 한다.
- 오래된 URL
: 오래된 URL의 목록으로 방문하였을 때, 존재하지 않은 문서에 대한 접근 요청으로 에러 로그가 채워지거나, 부하로 인해 서버의 요청에 대한 수용 능력이 감소된다.
- 길고 잘못된 URL
: URL이 충분히 길다면 웹 서버의 처리 능력에 영향을 주고 웹 서버의 접근 로그를 어지럽게 채우고 고장을 일으킬 수 있다.
- 호기심이 지나친 로봇
: 사적인 데이터에 대한 URL을 얻어 그 데이터를 인터넷 검색엔진이나 기타 애플리케이션을 통해 쉽게 접근할 수 있도록 만들 수 있다.
- 동적 게이트웨이 접근
: 게이트웨이 애플리케이션 콘텐츠에 대한 URL요청을 할 경우 특수 목적을 위한 것일 확률이 높고 처리 비용이 많이 들 것이다.
로봇 차단하기
"Robots Exclusion Standard" (robots.txt) : 로봇이 그들에게 맞지 않는 장소에 들어오지 않도록 하고 웹 마스터에게 로봇의 동작을 더 잘 제어할 수 있는 메커니즘을 제공하는 단순하고 자발적인 기법
서버의 문서 루트에 robots.txt라고 이름 붙은 선택적인 파일을 제공하면 어떤 부분에 접근할 수 있는지에 대한 정보가 담겨있다.
- 로봇 차단 표준
0.0 | 로봇 배제 표준-Disallow 지시자를 지원오리지널 robots.txt 메커니즘 |
1.0 | 웹 로봇 제어 방법-Allow 지시자의 지원이 추가된 마틴 코스터의 IETF 초안 |
2.0 | 로봇 차단을 위한 확장 표준 |
오늘날 v0.0이나 v1.0 표준을 채택
- 웹 사이트와 robots.txt 파일들
Disallow와 Allow: 특정 로봇에 대해 어떤 URL 경로가 명시적으로 금지되고, 허용되는지 기술
그 외 규칙:
- robots.txt 파일은 user-agent, disallow, allow와 함께 다른 필드를 포함할 수 있다.
- 하위 호환성을 위해 한 줄을 여러 줄로 나눠 적는 것은 허용되지 않는다.
- 주석 허용
- 로봇 차단 표준 버전 0.0은 Allow줄을 지원하지 않음
- robots.txt의 캐싱과 만료
: 로봇 명세 초안은 cache-control 지시자가 존재하는 경우 7일간 캐싱하도록 하고 있다.
로봇 에티켓
www.robotstxt.org/guidelines.html
The Web Robots Pages
Guidelines for Robot Writers Martijn Koster, 1993 This document contains some suggestions for people who are thinking about developing Web Wanderers (Robots), programs that traverse the Web. Reconsider Are you sure you really need a robot? They put a strai
www.robotstxt.org
검색 엔진
: 웹 로봇을 가장 광범위하게 사용하며 사용자가 전 세계의 어떤 주제에 대한 문서라도 찾을 수 있게 해준다.
- 넓게 생각하라
수백만 명의 사용자들이 생성하는 질의로 인한 부하를 다루기 위해 복잡한 질의 엔진이 필요한 것과 마찬가지로, 검색엔진은 수십억 개의 웹페이지들을 검색하기 위한 복잡한 크롤러를 사용해야 한다.
- 현대적인 검색엔진의 아키텍처
: 오늘날 검색엔진들은 전 세계의 웹페이지들에 대해 '풀 테스트 색인'이라 하는 복잡한 로컬 데이터베이스를 생성한다.
검색엔진 크롤러들은 웹 페이지들을 수집하여 풀 텍스트 색인에 추가함과 동시에 핫봇이나 구글과 같은 웹 검색 게이트웨이를 통해 풀 텍스트 색인에 대한 질의를 보낸다.
- 풀 텍스트 색인
: 단어 하나를 입력받아 그 단어를 포함하고 있는 문서를 즉각 알려줄 수 있는 데이터베이스
- 질의 보내기
: HTML 폼을 사용자가 채워 넣고 브라우저가 그 폼을 GET이나 POST 요청을 이용해서 게이트웨이로 보낸다. 게이트웨이 프로그램은 검색 질의를 추출하고 웹 UI 질의를 풀 텍스트 색인을 검색할 때 사용되는 표현식으로 변환한다.
- 검색 결과를 정렬하고 보여주기
: 많은 웹페이지가 주어진 단어를 포함할 수 있기 때문에, 검색엔진은 결과에 순위를 매기기 위한 알고리즘을 사용한다.
*관련도 랭킹: 관련이 많은 순서대로 결과 문서에 나타날 수 있도록 점수를 매기고 정렬하는 과정
- 스푸핑
: 많은 웹 마스터가 수많은 키워드들을 나열한 가짜 페이지를 만들거나, 검색 엔진의 관련도 알고리즘을 더 잘 속일 수 있는 특정 단어에 대한 가짜 페이지를 생성하는 게이트웨이 어플리케이션을 만들어 사용한다.