사람과의 상호작용 없이 연속된 웹 트랜잭션을 자동으로 수행하는 소프트웨어 프로그램이다. 그 방식에 따라 '크롤러', '스파이더', '웜', '봇' 등 각양각색의 이름으로 불린다.
EX)
주식시장 서버에서 매분 HTTP GET 요청을 보내고, 여기서 얻은 데이터를 활용해 주가 추이 그래프를 생성하는 주식 그래프 로봇
월드 와이드 웹의 규모와 진화에 대한 통계 정보를 수집하는 웹 통계 조사 로봇. 이것들은 웹을 떠돌면서 페이지의 개수를 세고, 각 페이지의 크기, 언어, 미디어 타입을 기록한다.
검색 데이터 베이스를 만들기 위해 발견한 모든 문서를 수집하는 검색엔진 로봇.
상품에 대한 가격 데이터베이스를 만들기 위해 온라인 쇼핑몰의 카탈로그에서 웹페이지를 수집하는 가격 비교 로봇
웹 크롤러는, 먼저 웹페이지를 한 개 가져오고, 그 다음 그 페이지가 가르키는 모든 웹페이지를 가져오고, 다시 그 페이지들이 가리키는 모든 웹페이지들을 가져오는, 이러한 일을 재귀적으로 반복하는 방식으로 웹을 순회하는 로봇이다.
(웹 링크를 재귀적으로 따라가는 로봇을 크롤러 혹은 스파이더라고 부르는데, HTML 하이퍼링크들로 만들어진 웹을 따라 '기어다니기(crawl) 때문이다.')
클롤러가 방문을 시작하는 URL들의 초기 집합은 루트 집합이라고 불린다. 좋은 루트 집합은 크고 인기 있는 웹 사이트, 새로 생성된 페이지들의 목록, 그리고 자주 링크되지 않는 잘 알려져 있지 않은 페이지들의 목록으로 구성.
크롤러는 검색한 각 페이지 안에 들어있는 URL 링크들을 파싱해서 크롤링할 페이지들의 목록에 추가 해야한다. 새 링크를 발견함에 따라 이 목록은 급속히 확장된다. 크롤러는 간단한 HTML 파싱을 해서 이들 링크들을 추출하고 상대 링크를 절대 링크로 변환할 필요가 있다.
로봇들은 순환을 피하기 위해 반드시 그들이 어디를 방문했는지 알아야한다.
1) 순환은 크롤러를 루프에 빠뜨려서 꼼짝 못하게 만들 수 있다.
2) 크롤러가 같은 페이지를 반복해서 가져오면 고스란히 웹 서버의 부담이 된다.
3) 크롤러는 많은 수의 중복된 페이지들을 가져오게 되는데 자신을 쓸모없게 만드는 중복된 콘텐츠로 넘쳐나게 될 것이다.
방문한 곳을 지속적으로 추적하는 것은 쉽지 않다. 대규모 웹 크롤러가 그들이 방문한 곳을 관리하기 위해 사용하는 유용한 기법을 알아보자.
1) 트리와 해시 테이블
2) 느슨한 존재 비트맵
3) 체크 포인트
4) 파티셔닝
한 URL이 또 다른 URL에 대한 별칭이라면, 그 둘이 서로 달라 보이더라도 사실은 같은 리소스를 가리키고 있다.
대부분의 웹 로봇은 URL들을 표준 형식으로 '정규화' 함으로써 다른 URL과 같은 리소스를 가리키고 있음이 확실한 것들을 미리 제거하려 시도한다.
로봇은 다음과 같은 방식으로 모든 URL을 정규화된 형식으로 변환할 수 있다.
1) 포트 번호가 명시되지 않았다면, 호스트 명에 ':80'을 추가한다.
2) 모든 %xx 이스케이핑된 문자들을 대응되는 문자로 변환한다.
3) # 태그들을 제거한다.
파일 시스템의 심벌릭 링크는 사실상 아무것도 존재하지 않으면서도 끝없이 깊어지는 디렉터리 계층을 만들 수 있기 때문에, 매우 교묘한 종류의 순환을 유발할 수 있다.
웹 마스터가 나쁜 뜻이 없음에도 자신도 모르게 심벌릭 링크나 동적 콘텐츠를 통한 크롤러 함정을 만들 수 있다.
모든 순환을 피하는 완벽한 방법은 없다. 실제로 잘 설계된 로봇은 순환을 피하기 위해 휴리스틱의 집합을 필요로 한다.
웹은 로봇이 문제를 일으킬 가능성으로 가득 차 있다. 이러한 웹에서 로봇이 더 올바르게 동작하기 위해 사용하는 기법들은 다음과 같다.
1) URL 정규화: URL을 표준 형태로 변환
2) 너비 우선 크롤링
3) 스로틀링: 로봇이 웹 사이트에서 일정 시간 동안 가져올 수 있는 페이지의 숫자를 제한
4) URL 크기 제한
5) URL/사이트 블랙리스트
6) 패턴 발견
7) 콘텐츠 지문: 페이지의 콘텐츠에서 몇 바이트를 얻어내어 체크섬을 계산.
8) 사람의 모니터링
로봇들은 다른 HTTP 클라이언트 프로그램과 다르지 않다. 그들 또한 HTTP 명세의 규칙을 지켜야한다. HTTP 요청을 만들고 스스로를 HTTP/1.1 클라이언트라고 광고하는 로봇은 적절한 HTTP 요청 헤더를 사용해야한다.
로봇 개발자들이 구현을 하도록 권장되는 기본적인 신원 식별 헤더들에는 다음과 같은 것이 있다.
1) User-Agent: 서버에게 요청을 만든 로봇의 이름을 말해준다.
2) From: 로봇의 사용자/관리자의 이메일 주소를 제공한다.
3) Accept: 서버에게 어떤 미디어 타입을 보내도 되는지 말해준다.
4) Referer: 현재의 요청 URL을 포함한 문서의 URL을 제공한다.
로봇 구현자들은 Host 헤더를 지원할 필요가 있다.
로봇 중의 몇몇은 시간이나 엔터티 태그를 비교함으로써 그들이 받아간 마지막 버전 이후에 업데이트 된 것이 있는지 알아보는 조건부 HTTP 요청을 구현한다.
대다수의 로봇들은 주 관심사가 단순히 Get메서드로 콘텐츠를 요청해서 가져오는 것이지만 특정 기능을 사용하는 로봇들이나, 웹 탐색이나 서버와의 상호작용을 더 잘 해보려고 하는 로봇들은 여러 종류의 HTTP응답을 다룰 줄 알 필요가 있다.
1) 상태 코드
2) 엔터티
웹 관리자들은 많은 로봇이 그들의 사이트를 방문하게 될 것임을 명심하과, 그 로봇들로부터의 요청을 예상해야 한다.
로봇들이 저지르는 실수들
1) 폭주하는 로봇: 로봇은 웹 서핑을 하는 사람보다 훨씬 빠르게 HTTP요청을 만들 수 있다. 만약 로봇이 논리적인 에러를 갖고 있거나 순환에 빠졌다면 웹 서버에 극심한 부하를 안겨줄 수 있다.
2) 오래된 URL: 로봇은 URL의 목록을 방문한다. 목록이 오래되었을 경우 존재하지 않은 URL에 대한 요청을 보낼 수 있다.
3) 길고 잘못된 URL: URL이 길다면 웹 서버의 처리 능력에 영향을 주고 고장을 일으킬 수도 있다.
4) 호기심이 지나친 로봇: 로봇은 많은 양의 데이터를 검색하므로 몇몇 사이트 구현자들이 인터넷을 통해 접근 가능하리라 생각하지 못했던 민감한 데이터에 접근될 수도 있다.
5) 동적 게이트웨이 접근: 로봇들이 접근하고 있는 것에 잘 알고 있는 것이 아니므로 게이트웨이 애플리케이션의 콘텐츠에 대한 URl 요청을 할 수도 있다.
로봇 차단 표준은 임시방편으로 마련된 표준이다.
웹 사이트의 어떤 URL을 방문하기 전에, 그 웹 사이트에 robots.txt파일이 존재한다면 로봇은 반드시 그 파일을 가져와서 처리해야한다.
1) robots.txt 가져오기: HTTP GET메서드를 이용해 robots.txt 리소스를 가져온다.
2) 응답 코드
1) User-Agent 줄: 각 로봇의 레코드는 하나 이상의 User-Agent줄로 시작하며 형식은 다음과 같다.
2) Disallow와 Allow 줄들: User-Agent줄들 바로 다음에 온다. 특정 로봇에 대해 어떤 URL경로가 명시적으로 금지되어 있고 명시적으로 허용되는지 기술한다.
3) Disallow/Allow 접두 매칭(prefix matching)
로봇은 주기적으로 robots.txt를 가져와서 그 결과를 캐시해야 한다.
robots.txt 파일과 상호작용하는 공개된 펄(Perl) 라이브러리가 몇 가지 존재한다. 한 예는 CPAN 공개 펄 아카이브의 WWW::RobotsRules 모듈이다.
HTML 페이지 저자는 로봇이 개별 페이지에 접근하는 것을 제한하는 좀 더 직접적인 방법을 갖고 있다.
NOINDEX
NOFOLLOW
INDEX
FOLLOW
NOARCHIVE
ALL
NONE
모든 로봇 META 태그는 name="robots" 속성을 포함한다.
1993년 웹 로봇 커뮤니티의 개척자인 마틴 코스터는 웹 로못을 만드는 사람들을 위한 가이드라인 목록을 작성했다. 그 조언 중 몇 가지는 구식이 되어버렸지만, 대다수는 아직도 상당히 유용하다.
1) 신원 식별
2) 동작
3) 스스로를 제한하라
4) 루프와 중복을 견뎌내기, 그리고 그 외의 문제들
5) 확장성
6) 신뢰성
7) 소통
웹 로봇을 가장 광범위하게 사용하는 것은 인터넷 검색 엔진이다. 인터넷 검색엔진은 사용자가 전 세계의 어떤 주제에 대한 문서라도 찾을 수 있게 해준다.
1) 넓게 생각하라
대규모 크롤러가 자신의 작업을 완료하려면 많은 장비를 똑똑하게 사용해서 요청을 병렬적로 수행할 수 있어야 할 것이라는 점은 명백하다. 그러나 그 규모 때문에, 웹 전체를 크롤링하는 것은 여전히 쉽지 않은 도전이다.
2) 현대적인 검색엔진의 아키텍쳐
오늘날 검색엔진들은 그들이 갖고 있는 전 세계의 웹페이지들에 대해 '풀 텍스트 색인'이라고 하는 복잡한 로컬 데이터베이스를 생성한다. 이 색인은 웹의 모든 문서에 대한 일종의 카드 카탈로그처럼 동작한다.
3) 풀 텍스트 색인
풀 텍스트 색인은 단어 하나를 입력받아 그 단어를 포함하고 있는 문서를 즉각 알려줄 수 있는 데이터베이스다. 이 문서들은 색인이 생성된 후에는 검색할 필요가 없다.
4) 질의 보내기
사용자가 질의를 웹 검색엔진 게이트웨이로 보내는 방법은 HTML 폼을 사용자가 채워 넣고 브라우저가 그 폼을 HTTP GET 이나 POST 요청을 이요해서 게이트웨이로 보내는 식이다. 게이트웨이 프로그램은 검색 질의를 추출하고 웹 UI 질의를 풀 텍스트 색인을 검색할 때 사용하는 표현식으로 변환한다.
5) 검색 결과를 정렬하고 보여주기
질의의 결과를 확인하기 위해 검색엔진이 색인을 한번 사용했다면, 게이트웨이 애플리케이션은 그 결과를 이용해 최종 사용자를 위한 결과 페이지를 즉석에서 만들어낸다.
6) 스푸핑
검색 결과에서 더 높은 순위를 차지하고자 하는 바람은 검색 시스템과 게임으로 이어졌고, 검색엔진과 자신의 사이트를 눈에 띄게 할 방법을 찾고 있는 사람들과의 줄다리기를 만들어냈다. 검색엔진과 로봇 구현자들은 속임수(검색 상위권을 위한 속임수)를 더 잘 잡아내기 위해 끊임없이 그들의 관련도 알고리즘을 수정해야한다.