웹 로봇은 사람과의 상호작용 없이 연속된 웹 트랜잭션들을 자동으로 수행하는 소프트웨어 프로그램이다. 콘텐츠를 가져오고, 하이퍼링크를 따라가고, 그들(웹 로봇)이 발견한 데이터를 처리한다. 방식에 따라 ‘크롤러’, ‘스파이더’ 등으로 불리는데 여기서는 크롤러라고 부르겠다.
웹 크롤러는 먼저 웹페이지를 한 개 가져오고, 그 다음 그 페이지가 가리키는 모든 웹페이지를 가져오고, 다시 그 페이지들이 가리키는 모든 웹페이지들을 가져온다. 즉, 재귀적으로 반복하는 방식으로 웹을 순회하는 로봇이다.
인터넷 검색엔진은 웹을 돌아다니면서 그들이 만나는 모든 문서를 끌어오기 위해 크롤러를 사용한다.
크롤러가 웹을 크롤링 할 때, 순환에 빠지지 않도록 조심해야 한다.
크롤러의 순환이 해로운 이유
트리와 해시 테이블
방문한 URL을 추적하기 위해 검색 트리나 해시 테이블을 사용할 수 있다.
느슨한 존재 비트맵
공간 사용을 최소화하기 위해 존재 비트 배열(presence bit array)과 같은 느슨한 자료 구조를 사용한다. URL을 해시 함수를 통해 고정된 크기의 숫자로 변환되고 해열 안에 대응하는 존재 비트를 갖는다.
체크포인트
크롤러가 갑자기 중단될 경우를 대비해 방문한 URL의 목록이 디스크에 저장되었는지 확인한다.
파티셔닝
각각이 분리된 한대의 컴퓨터의 로봇들이 URL들의 특정 ‘한 부분’을 할당되어 책임을 지고 각각은 서로 도와 웹 크롤링을 한다.
URL이 별칭을 가질 때, 어떤 페이지를 이전에 방문했었는지 확인이 쉽지 않을 때도 있다. 한 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/%7Ffred | %7F이 ~과 같을 때 |
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 | 서버가 대소문자를 구분하지 않을 때 |
http://www.foo.com/ | http://www.foo.com/index.html | 기본 페이지가 index.html일 때 |
http://www.foo.com/index.html | http://209.231.87.45/index.html | www.foo.com이 아이피 주소를 가질 때 |
파일 시스템의 심볼릭 링크는 사실상 아무것도 존재하지 않으면서도 끝없이 깊어지는 디렉터리 계층을 만들 수 있다.
URL 정규화
너비 우선 크롤링
스로틀링
URL 크기 제한
URL/사이트 블랙리스트
패턴 발견
콘텐츠 지문(fingerprint)
사람의 모니터링
로봇들은 다른 HTTP 클라이언트 프로그램과 다르지 않다. 그들 또한 HTTP 명세의 규칙을 지켜야 한다. HTTP 요청을 만들고 적절한 HTTP 요청 헤더를 사용해야 한다.
많은 로봇이 그들이 찾는 콘텐츠를 요청할 때 필요한 HTTP를 최소한으로만 사용해 요청하고 싶기에 많은 로봇들이 요구사항이 적은 HTTP/1.0 요청을 보낸다.
로봇들은 약간의 신원 식별 헤더를 구현하고 전송한다.
User-Agent
From
Accept
Referer
HTTP/1.1에서는 Host 헤더를 요구한다. 가상 호스팅이 퍼져있는 현실에서 요청에 Host 헤더를 포함하지 않으면 로봇이 어떤 URL에 대해 잘못된 콘텐츠를 찾을 수 있다.
두 개의 사이트를 운영하는 서버가 있을 경우 Host 헤더를 포함하지 않은 요청을 했을 때, 원하지 않은 리소스를 받을 수 있다.
대다수의 로봇들은 GET 메소드로 콘텐츠를 요청해서 가져온다. 그렇기에 HTTP 응답을 잘 다룰 줄 알아야 한다.
상태코드
엔터티
- 로봇 구현자들은 http-equiv 정보를 찾아내기 위해 HTML 문서의 HEAD 태그를 탐색하기를 원할 수 있다.
폭주하는 로봇
오래된 URL
길고 잘못된 URL
호기심이 지나친 로봇
동적 게이트웨이 접근
로봇이 서버에게 맞지 않는 장소에 들어오지 않도록 하고 웹 마스터에게 로봇의 동작을 더 잘 제어할 수 있는 메커니즘을 제공하는 단순하고 자발적인 기법이 제안되었다.
로봇의 접근을 제어하는 정보를 저장하는 파일의 이름 따서 robots.txt라 부른다.
웹 서버는 서버의 문서 루트에 robots.txt라고 이름 붙은 선택적인 파일을 제공할 수 있다. 이 파일은 어떤 로봇이 서버의 어떤 부분에 접근할 수 있는지에 대한 정보를 담는다. 만약 어떤 로봇이 이 자발적인 표준에 따른다면, 그것은 웹 사이트의 어떤 다른 리소스에 접근하기 전에 우선 그 사이트의 robots.txt를 요청한다.
웹 사이트의 어떤 URL을 방문하기 전에, 그 웹 사이트의 docroot에 robots.txt 파일이 존재한다면 로봇은 반드시 그 파일을 가져와서 처리해야 한다. 호스트 명과 포트번호에 의해 정의되는 어떤 웹 사이트가 있을 때, 그 사이트 전체의 대한 robots.txt 파일은 단 하나만 존재한다.
로봇은 웹 서버의 여느 파일들과 마찬가지로 HTTP GET 메소드를 이용해 robots.txt 리소스를 가져온다. robots.txt가 존재한다면 서버는 그 파일을 반드시 text/plain 본문으로 반환해야한다. 만약 서버가 404(Not Found) 상태 코드로 응답한다면 로봇은 그 서버는 로봇의 접근을 제한하지 않는 것으로 간주하고 어떤 파일이든 요청하게 된다.
로봇은 사이트 관리자(서버)가 로봇의 접근을 추적할 수 있도록 From이나 User-Agent헤더를 통해 신원 정보를 넘겨야 한다.
💡 **** GET / robots.txt HTTP/1.0 Host: www.example.com User-Agent: GoogleBot Date: Wed Oct 3 00:00:00 EST 2001로봇은 어떤 웹 사이트든 반드시 robots.txt를 찾아본다. 로봇은 robots.txt의 검색 결과에 따라 다르게 동작한다.
응답 코드 그룹 | 설명 | |
---|---|---|
2xx | Successful | 서버가 성공(HTTP 상태 코드 2XX)으로 응답하면 그 응답의 콘텐츠를 파싱하여 차단 규칙을 얻고, 그 사이트에서 무언가를 가져오려 할 때 그 규칙에 따르게 된다. |
만약 robots.txt가 HTML 문서로 반환된다면 그 안에 유효한 규칙이 있더라도 robots.txt가 없음(모두 허용)으로 해석될 수 있으므로 텍스트 파일 (text/plain)로 작성해야 한다. | ||
3xx | Redirection | 서버 응답이 리다이렉션 (HTTP 상태 코드 3XX)이라면 로봇은 리소스가 발견될 때까지 리다이렉션을 따라가야 한다. |
하지만 각각의 크롤러들마다 기준이 있다. | ||
4xx | Client Error | 만약 리소스가 존재하지 않는다고 서버가 응답 (HTTP 상태 코드 4XX) 하면 로봇은 규칙이 존재하지 않는다고 가정하고 robots.txt의 제약 없이 (모두 허용) 사이트에 접근할 수 있다. |
5xx | Server Error | 요청이 실패했다면 (HTTP 상태 코드 5XX) 로봇은 그 사이트의 리소스를 검색하는 것을 뒤로 미루어야 한다. |
하지만 각각의 크롤러들마다 기준이 있다. |
*참고 : https://searchadvisor.naver.com/guide/seo-basic-robots
https://developers.google.com/search/docs/crawling-indexing/robots/robots_txt?hl=ko
robots.txt 파일은 매우 단순한 줄 기반 문법을 갖는다.
robots.txt의 줄들은 레코드로 구분된다. 각 레코드는 규칙 줄들의 집합으로 되어 있으며 빈 줄이나 파일 끝 문자로 끝난다. 레코드는 어떤 로봇이 이 레코드에 영향을 받는지 지정하는 하나 이상의 User-Agent 줄로 시작하며 뒤이어 이 로봇들이 접근 혹은 비접근을 할 수 있는 URL들을 말해주는 Allow 줄과 Disallow 줄이 온다.
지원하는 필드
user-agent
: 규칙이 적용되는 크롤러를 식별합니다.allow
: 크롤링할 수 있는 URL 경로입니다.disallow
: 크롤링할 수 없는 URL 경로입니다.robots.txt를 이용한 예시
만약 모든 로봇에게 문서 접근을 허락하려면, robots.txt에 다음과 같이 입력하면 된다.
User-agent: *
Allow: /
모든 로봇을 차단하려면, robots.txt에 다음과 같이 입력하면 된다.
User-agent: *
Disallow: /
모든 로봇에 세 디렉터리 접근을 차단하려면, robots.txt에 다음과 같이 입력하면 된다.
User-agent: *
Disallow: /cgi-bin/
Disallow: /tmp/
Disallow: /junk/
모든 로봇에 특정 파일 접근을 차단하려면, robots.txt에 다음과 같이 입력하면 된다.
User-agent: *
Disallow: /directory/file.html
BadBot 로봇에 모든 파일 접근을 차단하려면, robots.txt에 다음과 같이 입력하면 된다.
User-agent: BadBot
Disallow: /
BadBot 과 Googlebot 로봇에 특정 디렉터리 접근을 차단하려면, robots.txt에 다음과 같이 입력하면 된다.
User-agent: BadBot
User-agent: Googlebot
Disallow: /private/
여러 레코드를 조합하여 사용할 수 있다.
User-agent: googlebot # googlebot 로봇만 적용
Disallow: /private/ # 이 디렉토리를 접근 차단한다.
User-agent: googlebot-news # googlebot-news 로봇만 적용
Disallow: / # 모든 디렉토리를 접근 차단한다.
User-agent: * # 모든 로봇 적용
Disallow: /something/ # 이 디렉토리를 접근 차단한다.
로봇은 주기적으로 robots.txt를 가져와서 그 결과를 캐시해야 한다. robots.txt의 캐시된 사본은 robots.txt 파일이 만료될 때까지 로봇에 의해 사용된다. robots.txt 파일의 캐싱을 제어하기 위해 표준 HTTP 캐시 제어 메커니즘이 원 서버와 로봇 양쪽 모두에 의해 사용된다. 로봇은 HTTP 응답의 Cache-Control과 Expires 헤더에 주의를 기울여야 한다.
오늘날 많은 크롤러 제품들은 HTTP/1.1 클라이언트가 아니다. 이 크롤러들이 robots.txt 리소스에 적용되는 캐시 지시자를 이해하지 못할 수도 있다는 점을 주의해야 한다.
HTML 문서에 직접 로봇 제어 태그를 추가할 수 있다.
설명 | 예시 | |
---|---|---|
NOINDEX | 로봇에게 해당 페이지를 처리하지 말고 무시하라고 말해준다.(해당 페이지의 콘텐츠를 색인이나 데이트베이스에 포함시키지 말것) | |
NOFOLLOW | 로봇에게 해당 페이지가 링크한 페이지를 크롤링하지 말라고 말해준다. | |
INDEX | 로봇에게 해당 페이지의 콘텐츠를 인덱싱해도 된다고 말해준다. | |
FOLLOW | 로봇에게 해당 페이지가 링크한 페이지를 크롤링해도 된다고 말해준다. | |
NOARCHIVE | 로봇에게 해당 페이지의 캐시를 위한 로컬 사본을 만들어서는 안 된다고 말해준다. | |
ALL | INDEX, FOLLOW와 같다. | |
NONE | NOINDEX, NOFOLLOW와 같다. |
설명 | 예시 | |
---|---|---|
DESCRIPTION | 저자가 웹페이지의 짧은 요약을 정의할 수 있게 해준다. 많은 검색엔진이 페이지 저자가 그들의 웹페이지에 대해 기술하는 짧고 적절한 요약을 지정할 수 있도록 해주는 meta description태그를 살펴본다. | <meta name=”description” content=”어서오세요. 환영합니다”> |
KEYWORDS | 키워드 검색을 돕기 위한 웹페이지를 기술하는 단어들의 쉼표로 구분되는 목록 | <meta name=”keywords” content=”HI, Hello”> |
REVISIT-AFTER | 로봇이나 검색엔진에게 해당 페이지는 아마도 쉽게 변경될 것이기 때문에 지정된 만큼의 날짜가 지난 이후에 다시 방문해야 한다고 지시한다. | <meta name=”revisit-after” content=”10 days”> |
인터넷 검색엔진은 사용자가 전 세계의 어떤 주제에 대한 문서라도 찾을 수 있게 해 준다.
오늘날 검색엔진들은 그들이 갖고 있는 전 세계의 웹페이지들에 대해 ‘풀 텍스트 색인(full-text indexes)’이라고 하는 복잡한 로컬 데이터베이스를 생성한다. 이 색인은 웹의 모든 문서의 대한 일종의 카드 카탈로그처럼 동작한다. 검색엔진 크롤러들은 웹페이지들을 수집하여 서버에 가져와서, 이 풀 텍스트 색인에 추가한다.
풀 텍스트 색인 : 단어 하나를 입력받아 그 단어를 포함하고 있는 문서를 즉각 알려줄 수 있는 데이터베이스.