웹 로봇은 사람과의 상호작용 없이 연속된 웹 트랜젝션들을 자동으로 수행하는 소프트웨어 프로그램
웹 로봇의 몇 가지 예를 들어보자.
웹 크롤러
웹 페이지 한 개 -> 한 개가 가리키는 모든 웹페이지 -> 모든 웹페이지가 가리키는 모든 웹페이지를 따라
웹 링크를 재귀적으로 따라가는 로봇 (크롤러 혹은 스파이더)
크롤러가 방문을 시작하는 URL들의 초기 집합은 루트 집합(root set) 이라고 불린다.
루트 집합을 고를 때, 모든 링크를 크롤링하면 결과적으로 관심 있는 웹 페이지들의 대부분을 가져올 수 있도록
충분히 다른 장소에서 URL들을 선택해야 한다.
일반적으로 좋은 루트 집합은 크고 인기있는 웹 사이트(www.google.com), 새로 생성된 페이지들의 목록,
자주 링크되지 않는 잘 알려지지 않은 페이지들의 목록으로 구성
대규모 크롤러 제품들은 사용자들이 루트 집합에 새 페이지나 잘 알려지지 않는 페이지들을 추가하는 기능을 제공한다.
시간이 지남에 따라 성장하며 새로운 크롤링을 위한 시드 목록이된다.
로봇이 웹을 크롤링할 때, 루프나 순환에 빠지지 않도록 매우 조심해야한다.
A->B->C->A->B->C
순한은 최소 다음의 세 가지 이유로 크롤러에게 해롭다.
대규모 웹 크롤러가 그들이 방문한 곳을 관리하기 위해 사용하는 유용한 기법 몇 가지를 살펴보자.
'존재 비트(presence bit)'
를 갖는다. URL이 별칭을 가질 수 있는 이상 어떤 페이지를 이전에 방문했는지 말해주는게 쉽지 않을 수 있다.
한 URL이 또 다른 URL에 대한 별칭이라면, 그 둘이 달라보여도 사실은 같은 리소스를 가리키고 있다.
다음은 다른 URL이 같은 리소스를 가리키게 되는 몇 가지 상황이다.
// 기본 포트가 80일 떄
http://www.foo.com/bar.html
http://www.foo.com:80/bar.html
// %7F이 ~와 같을 때
http://www.foo.com/~fred
http://www.foo.com/%7Ffred
// 태그에 따라 페이지가 바뀌지 않을 때
http://www.foo.com/x.html#early
http://www.foo.com/x.html#middle
// 서버가 대소문자 구분하지 않을 때
http://www.foo.com/readme.html
http://www.foo.com/README.HTML
// 기본 페이지가 index.html 일 때
http://www.foo.com/index.html
http://www.foo.com/
URL들을 표준 형식으로 '정규화' 함으로써 다른 URL과 같은 리소스를 가리키고 있음이 확실한 것들은
미리 제거하려 시도한다. 로봇은 다음과 같은 방식으로 모든 URL을 정규화된 형식으로 변환할 수 있다.
파일 시스템의 심벌릭 링크 순환은 서버 관리자가 실수로 만들게 되는게 보통이지만,
때때로 누군가 로봇을 함정에 빠뜨리기 위해 악의적으로 만들기도 한다.
(a)의 파일시스템을 사용해, 웹 크롤러는 다음의 동작을 수행한다.
(b)의 파일시스템 에서는 다음과 같은 일이 벌어진다.
(b)의 문제는 로봇이 심벌릭 링크 순환을 알아차리지 못하고 URL이 달라서 루프로 빠져들 위험이 있다.
악의적인 누군가가 로봇들을 함정으로 빠뜨리기 위해 의도적으로 복잡한 크롤러 루프를 만드는 경우도 있다.
또는, 나쁜 뜻이 없음에도 자신도 모르게 심벌릭 링크나 동적 콘텐츠를 통한 크롤러 함정을 만들 수 있다.
모든 순환을 피하는 완벽한 방법은 없다.
웹은 로봇이 문제를 일으킬 가능성으로 가득 차 있다. 이러한 웹에서 로봇이 더 올바르게 동작하기 위해
사용하는 기법들은 다음과 같다.
URL 정규화
너비 우선 크롤링
스로틀링
URL 크기 제한
URL/사이트 블랙리스트
패턴 발견
콘텐츠 지문(fingerprint)
페이지의 콘텐츠에서 몇 바이트를 얻어내어 체크섬을 계산
이전에 보았던 체크섬을 발견하면 그 페이지의 링크는 크롤링하지 않음
어떤 웹 서버들은 동적으로 그때그때 페이지를 수정하므로, 로봇들은 때때로 웹페이지 콘텐츠에 임베딩된 링크와
같은 특정 부분들을 체크섬 계산에서 빠뜨림
사람의 모니터링
로봇의 능력, 신원, 출신을 알려주는 기본적인 몇 가지 헤더를 사이트에게 보내주는 것이 좋다.
로봇 개발자들이 구현을 하도록 권장되는 기본적인 신원 식별 헤더들은 다음과 같다.
User-Agent
From
Referer
요청에 Host 헤더를 포함하지 않으면 로봇이 어떤 URL에 대해 잘못된 콘텐츠를 찾게 만든다.
이러한 이유로 HTTP/1.1은 Host 헤더를 사용할 것을 요구한다.
로봇 중 몇몇은 시간이나 엔터티 태그를 비교해서 그들이 받아간 마지막 버전 이후에 업데이트 된 것이
있는지 알아보는 조건부 HTTP 요청을 구현한다.
HTTP 캐시가 전에 받아온 리소스의 로컬 사본이 유효한지 검사하는 방법과 매우 비슷하다.
대다수 로봇은 GET 메소드로 콘텐츠 요청을 하기 때문에, 응답 다루기라고 부를 만한 일은 거의 하지 않는다.
그러나, 웹 탐색이나 서버와 상호작용을 더 잘 해보려는 로봇들은 HTTP 응답을 다룰 필요가 있다.
상태 코드
엔터티
폭주하는 로봇
오래된 URL
길고 잘못된 URL
호기심이 지나친 로봇
동적 게이트웨이 접근
어떤 웹 서버는 서버의 문서 루트에 robots.txt
라고 이름 붙은 선택적인 파일을 제공할 수 있다.
이 파일은 어떤 로봇이 서버의 어떤 부분에 접근할 수 있는지에 대한 정보가 담겨있다.
예를 들어, 어떤 로봇이 http://www.gies-hardware.com/specials/test.html
을 다운받는 요청을
하기 전에 먼저 해당 페이지를 가져올 수 있는 권한이 있는지 robots.txt
파일을 통해 검사한다.
로봇 차단 표준에는 버전의 이름이 잘 정의되어 있지 않지만 세 가지 버전이 존재한다.
0.0
(1994년 6월) 1.0
(1996년 11월) 2.0
(1996년 11월) 오늘날 대부분의 로봇은 v0.0이나 v1.0표준을 채택했다.
널리 사용되고 v0.0과 완전 호환이 되는 v1.0표준에 초점을 맞추어 설명한다.
robots.txt 가져오기
다음은 상용 웹 로봇이 보낼 수 있는 HTTP 크롤러 요청의 예다.
GET /robots.txt HTTP/1.0
Host: www.joes-hardware.com
User-Agent: Slurp/2.0
...
응답 코드
로봇은 robots.txt의 검색 결과에 따라 다르게 동작한다.
User-Agent: slurp
User-Agent: webcrawler
Disallow: /private
User-Agent: *
Disallow:
robots.txt의 이 줄들은 레코드로 구분된다. 각 레코드는 특정 로봇들의 집합에 대한 차단 규칙의 집합을 기술한다.
각 레코드는 빈 줄이나 파일끝(end-of-file) 문자로 끝난다.
어떤 로봇이 이 레코드에 영향을 받는지 지정하는 하나 이상의 User-Agent 줄로 시작하며 뒤이어 접근할 수 있는
URL정보인 Allow줄과 Disallow줄이 온다.
위의 예는 robots.txt 파일이 Slurp과 Webcraweler 로봇들이 사적인 하위 디렉토리 안에 있는 것을 제외한
어떤 파일이든 접근할 수 있도록 허용한 것을 보여준다.
또한, 다른 로봇들이 이 사이트의 그 무엇에도 접근할 수 없도록 막는다.
User-Agent 줄
User-Agent: <robot-name>
or
User-Agent: *
robots.txt 파일을 처리한 로봇은 다음의 레코드에 반드시 복종해야 한다.
만약, 위의 두 조건의 줄을 찾지 못했다면, 대응하는 레코드가 없는 것이므로 접근에 어떠한 제한도 없다.
Disallow와 Allow 줄들
로봇 차단 레코드의 User-Agent 줄들 바로 다음에 온다.
특정 로봇에 대해 어떤 URL 경로가 명시적으로 금지되어 있고 허용되어 있는지 기술한다.
Disallow와 Allow 접두 매칭(prefix matching)
규칙 경로 | URL 경로 | 매치? |
---|---|---|
/tmp | /tmp | O |
/tmp | /tmpfile.html | O |
/tmp/ | /tmp | X |
빈 문자열 | README.TXT | O |
/~fred/hi.html | %7Efred/hi.html | O |
/~fred/hi.html | ~fred%2Fhi.html | X |
<META NAME="ROBOTS" CONTENT=directive-list>
로봇 META 지시자
가장 널리 쓰이는 로봇 META 지시자 두 가지는 다음과 같다.
<META NAME="ROBOTS" CONTENT="NOINDEX">
<META NAME="ROBOTS" CONTENT="NOFOLLOEW">
두 개 이외에 의미가 반대인 INDEX, FOLLOW 지시자와 ALL, NONE 지시자가 있다.
HTML의 HEAD 섹션에 나타나야 하며, name과 content 값은 대소문자를 구분하지 않는다.
검색엔진 META 태그
name= | content= | 설명 |
---|---|---|
DESCRIPTION | <텍스트> | 저자가 웹페이지의 짧은 요약을 정의할 수 있게 해준다. |
KEYWORDS | <쉼표 목록> | 키워드 검색을 돕기 위한, 웹페이지를 기술하는 단어를 쉼표로 구분 |
REVISIT-AFTER | <숫자 days> | 지정된 만큼의 날짜가 지난 이후에 다시 방문해야 한다고 지시(그다지 널리 지원되지 않음) |
1993년 웹 로봇 커뮤니티의 개척자인 마틴 코스터는 웹 로봇을 만드는 사람들을 위한 가이드라인 목록을 작성했다.
몇 개는 구식이 되었지만, 대다수는 아직도 유용하다.
링크 :로봇 제작자들을 위한 가이드 라인
자세한 설명은 p.277~279 참조
수백만 명의 사용자들이 수십억 개의 웹페이지에서 원하는 정보를 찾는 상황에서, 수백만 명의 사용자들이
생성하는 질의로 인한 부하를 다루기 위해 복잡한 질의 엔진이 필요한 것과 마찬가지로,
검색엔진은 수십억 개의 웹페이지들을 검색하기 위해 복잡한 크롤러를 사용해야 한다.
오늘날 검색엔진들은 전 세계의 웹페이지들에 대해 '풀 텍스트 색인(full-text indexes)' 라고 하는
복잡한 로컬 데이터베이스를 생성한다.
사용자는 'drills'를 검색 상자 폼에 타이핑하고 브라우저는 이를 질의 매개변수를 URL의 일부로 포함하는
GET 요청으로 번역한다.
죠의 하드웨어 웹 서버는 이 질의를 받아서 검색 게이트웨이 애플리케이션에게 넘겨준다.
게이트웨이는 웹 서버에게 문서의 목록을 결과로 돌려주고, 웹 서버는 이 결과를 사용자를 위한 HTML 페이지로 변환한다.
많은 웹페이지가 주어진 단어를 포함할 수 있기 때문에, 검색엔진은 결과에 순위를 매기기 위해 똑똑한 알고리즘을 사용한다.
예를 들어, 사용자가 'hello' 를 검색했다면, 검색엔진은 주어진 단어와 관련이 많은 순서대로
결과 문서에 나타날 수 있도록 문서들 간의 순서를 알 필요가 있다.
이것은 관련도 랭킹(relevancy ranking)
이라고 불리며 검색 결과의 목록에 점수를 매기고 정렬하는 과정이다.
검색엔진에 사용되는 알고리즘, 크롤링에 대한 팁, 그 외 각종 기교는 검색엔진의 가장 엄격히 감추어진 비밀들이다.
사용자들은 검색 결과 최상위 몇 줄에서 원하는 결과를 얻지 못하면 불만족스러워 해서 사이트의 검색 결과 순서는 중요하다.
검색 결과에 더 높은 순위를 차지하고자 하는 바람으로, 검색엔진과 자신의 사이트를 눈에 띄게 하려는 자들의
끝나지 않는 줄다기리가 만들어졌다.