9. 웹 로봇
자동으로 웹 사이트들을 탐색하며 그 방식에 따라 '크롤러', '스파이더', '웜', 봇' 등의 다양한 이름으로 불립니다.
#
9.1 크롤러와 크롤링- 웹 크롤러는 웹 페이지 하나를 가져오고, 그 다음 그 페이지가 가리키는 모든 웹페이지를 가져오는 일 등을 재귀적으로 반복하는 방식으로 웹을 순회하는 로봇
- 인터넷 검색엔진은 웹을 돌아다니면서 그들이 만나는 모든 문서를 끌어오기 위해 크롤러를 사용합니다.
#
어디에서 시작하는가: '루트 집합'크롤러를 풀기 위해서는 출발지점을 주어야하며, 크롤러가 방문을 시작하는 URL들의 초기 집합을 루트 집합(root set) 이라고 부릅니다.
일반적으로 좋은 루트 집합은 크고 인기 있는 웹 사이트, 새로 생성된 페이지들의 목록, 자주 링크되지 않는 잘 알려져있지 않은 페이지들의 목록으로 구성됩니다.
#
링크 추출과 상대 링크 정상화크롤러는 웹을 돌아다니면서 꾸준히 HTML 문서를 검색하며, 각 페이지안의 URL 링크를 파싱하여 크롤링 페이지들의 목록에 추가합니다.
#
순환 피하기로봇들은 순환을 피하기 위해서 반드시 그들이 어디를 방문했는지에 대해 알아야합니다. 순환은 로봇을 함정에 빠트려 멈추게나 혹은 진행을 느리게 합니다.
#
루프와 중복순환은 크롤러에게 다음의 단점을 제공합니다.
- 순환은 크롤러를 루프에 빠뜨려서 꼼짝 못하게 합니다.
- 크롤러가 같은 페이지를 반복해서 가져오면 웹 서버의 부담이 됩니다.
- 비록 루프 자체가 문제가 되지 않아도, 많은 수의 중복된 페이지(dups)들을 가져오게 됩니다.
#
빵 부스러기의 흔적전세계의 웹 URL을 방문했는지 추적하려면 복잡한 자료구조를 사용할 필요가 있으며, 이 자료 구조는 속도와 메모리 사용 면에서 효과적이어야합니다.
- 트리와 해시 테이블 : 복잡한 로봇의 경우, 검색 트리나 해시 테이블의 사용합니다.
- 느슨한 존재 비트맵 : 공간 사용을 최소화하기 위해 몇몇 대규모 크롤러들은 존재 비트 배열과 같은 느슨한 자료 구조를 사용합니다.
- 체크 포인트 : 로봇의 갑작스러운 중단에 대비해 방문한 URL 목록이 디스크에 저장되었는지 확인합니다.
- 파티셔닝 : 웹이 성장하면서 한 대의 컴퓨터에서 하나의 로봇이 크롤링이 불가능하므로, 몇몇 대규모 웹 로봇은 농장(farm)을 이용하며 각 로봇은 URL들의 특정 '한 부분'이 할당되어 그에 대한 책임을 집니다.
#
별칭(alias)과 로봇 순화올바른 자료 구조가 있더라도 URL이 별칭을 가질 수 있는 이상, 이를 방문했는지에 대해 쉽지 않을 때가 있습니다.
#
URL 정규화대부분의 웹 로봇은 URL들이 표준 형식으로 정규화
함으로써 다른 URL과 같은 리소스를 가리키고 있음이 확실한 것들을 미리 제거하려고 시도합니다.
- 포트 번호가 명시되지 않았다면, 호스트 명에 ':80'을 추가합니다.
- 모든 %xx 이스케이핑된 문자들을 대응하는 문자로 변환합니다.
#태그
들을 제거합니다.
#
파일 시스템 링크 순환- 파일 시스템의 심벌릭 링크는 의미도 없고, 깊어지는 디렉터리 계층이 생길 수 있습니다, (교묘한 종류의 순환)
- 이러한 루프를 발견하지 못하면 URL의 길이가 로봇이나 서버의 한계를 넘을 때까지 이 순환이 계속됩니다.
#
동적 가상 웹 공간- 다만 위의 페이지 순환을 감지하기는 매우 어렵습니다.
- 대표적으로 로봇은 달력의 다음달을 계속 누를수도 있습니다. (인간과 다르므로)
#
루프와 중복 피하기모든 순환을 피하는 완벽한 방법이 없으며, 잘 설계된 로봇은 순환을 피하기 위해 휴리스틱의 집합을 필요로합니다.
다음의 기법을 주로 사용합니다.
- URL 정규화 : URL을 표준 형태로 변환함으로써 같은 리소스를 가리키는 중복된 URL을 회피합니다.
- 너비 우선 크롤링 : URL들의 큰집합에서 너비 우선으로 스케줄링하면 순환의 영향이 적어집니다.
- 스로틀링 : 로봇이 웹 사이트에서 일정 시간 동안 가져올 수 있는 페이지의 숫자를 제한합니다.
- URL 크기 제한 : 로봇은 일정 길이를 넘는 URL의 크롤링을 거부할 수 있습니다. (보통 1KB) 추가적으로 에러로그를 통해 어느 사이트에서 문제가 발생하는지 확인할 수 있습니다.
- URL/사이트 블랙리스트 : 함정 사이트에 대한 URL 목록을 만듭니다.
- 패턴 발견 : 파일 시스템의 심벌릭 링크를 통한 순환과 그와 비슷한 오설정들은 일정 패턴을 따르므로 이러한 반복 구성요소를 크롤링하는 것을 거절합니다.
- 콘텐츠 지문(fingerprint) : 콘텐츠에서 몇 바이트를 얻어내 체크섬(checksum)을 계산하고 이를 통해서 중복을 방지합니다. 중복이 적은 체크섬을 사용하며 보통 MD5와 같은 메시지 요약 함수가 인기 있습니다.
- 사람의 모니터링 : 위의 기법을 적용해도 해결이 안되는 부분은 사람의 모니터링을 통해 해결합니다.
#
9.2 로봇의 HTTP- 로봇들도 HTTP 명세의 규칙을 지켜야합니다.
- 많은 로봇이 그들이 찾는 콘텐츠를 요청하기 위해 필요한 HTTP을 최소한으로만 구현하려고 합니다.
#
요청 헤더 식별하기- 로봇들도 대부분은 약간의 신원 식별 헤더를 구현하고 전송합니다.
- 로봇을 나타내는 정보를 기본적인 헤더를 사이트에게 보내주는 것이 좋습니다.
User-Agent
: 서버에게 요청을 만든 로봇의 이름을 말해줍니다.From
: 로봇의 사용자/관리자의 이메일 주소를 제공합니다.Accept
: 서버에게 어떤 미디어 타입을 보내도 되는지 말해줍니다.Referer
: 현재 요청 URL을 포함한 문서의 URL을 제공합니다.
#
가상 호스팅- 로봇 구현자들은 Host 헤더를 지원할 필요가 있습니다.
- 대부분의 서버들은 기본적으로 특정 사이트 하나를 운영하도록 설정되어 있습니다.
#
조건부 요청- 로봇이 검색하는 콘텐츠의 양을 최소화하는 것은 의미있습니다.
- 로봇의 몇몇은 시간이나 엔티티 태그를 비교함으로써 마지막 버전 이후에 업데이트 된 것이 있는지 알아보는 조건부 HTTP 요청을 구현합니다.
#
응답 다루기대다수 로봇은 주 관심사가 단순히 GET 메서드 콘텐츠를 요청해서 가져오므로 응답은 거의 받지 않습니다. 그렇나 일부 로봇은 HTTP 응답을 다룰 필요가 있습니다.
#
상태 코드- 로봇들은 최소한 일반적인 상태코드나 예상할 수 있는 상태 코드를 다룰 수 있어야합니다. (200 OK, 404 Not Found)
- 모든 서버가 언제나 항상 적절한 에러 코드를 반환하지 않기때문에 조심해야합니다.
#
엔티티- HTTP 헤더에 임베딩된 정보를 따라 로봇들은 엔터티 자체의 정보를 찾을 수 있습니다.
- 몇몇 서버는 HTML 페이지를 보내기 전에 그 내용을 파싱하여 http-equiv 태그를 헤더로 포함시킵니다.
User-Agent
타기팅#
- 많은 웹 사이트들은 그들의 여러 기능을 지원할 수 있도록 브라우저의 종류를 감지하여 그에 맞게 콘텐츠를 최적화합니다.
- 사이트 관리자들은 로봇이 사이트를 방문했을때 콘텐츠를 제공 못하는 경우를 방지해야합니다.
#
9.3 부적절하게 동작하는 로봇들로봇이 통제를 읽으면 다음의 문제를 만들 수 있습니다.
폭주하는 로봇
- 로봇이 논리적인 에러나 순환에 빠졌다면 웹 서버에 극심한 부하를 줄 수 있습니다.
- 반드시 로봇을 설계할 때는 폭주 방지를 설계해야합니다.
오래된 URL
- 존재하지 않는 URL에 대한 요청을 많이 보낼 수 있고 이에 따른 에러 로그가 많이 발생할 수 있습니다.
길고 잘못된 URL
- 크고 의미 없는 URL을 요청할 수 있습니다.
- URL이 긴 경우, 웹 서버의 처리 능력에 영향을 주고 웹 서버 로그를 어지럽게 합니다.
호기심이 지나친 로봇
- 사적인 데이터를 쉽게 접근하도록 하는 것은 사생활 침해로 볼 수 있습니다.
- 웹에서 사이트 구현자들이 사이트 구현자들이 원하지 않는 데이터를 접근하지 않도록 하는 것이 좋습니다.
동적 게이트웨어 접근
- 로봇이 게이트웨어 애플리케이션의 콘텐츠에 대한 URL로 요청하는 것은 좋지 않은 상황입니다.
#
9.4 로봇 차단하기- 로봇의 접근 제어하는 정보를 종종
robots.txt
라고 부릅니다. - 이를 통해서 접근을 판단합니다.
#
로봇 차단 표준- 로봇 차단 표준은 임시 방편으로 마련된 표준입니다.
- 대부분 v1.0을 지원합니다.
#
웹 사이트와 robots.txt 파일들- 어떤 URL을 방문하기 전에 그 웹 사이트에 robots.txt 파일이 있다면 로봇은 반드시 그 파일을 가져와서 처리해야합니다.
- 일반적으로 사이트에 대한 robots.txt 파일은 하나만 존재합니다.
#
robots.txt 가져오기#
응답하기- 많은 사이트는 robots.txt를 가지고 있지않습니다. 따라서 robots.txt의 검색 결과에 따라 다르게 동작합니다.
- 리소스가 존재시 차단 규칙에 의거하여 동작합니다.
- 리소스가 없으면 차단 규칙이 존재하지 않다고 가장하고 사이트에 접근합니다.
- 401, 403 에러시 사이트 접근을 제한한 것으로 이해합니다.
- 503 에러는 나중에 다시 검색합니다.
- 3XX 인 겨우, 리다이렉트를 따라갑니다.
#
robots.txt 파일 포맷대표적인 예시는 다음과 같습니다.
- 각 라인은 레코드로 분리됩니다.
User-Agent
로 시작되며 그 후로Allow
와Disallow
줄이 옵니다.
User-Agent 줄
User-Agent: <robot-name>
혹은User-Agent: *
의 형태를 가집니다.- User-Agent가 없다면 대응하는 레코드가 없으므로 접근에는 제한이 없습니다.
Disallow와 Allow 줄들
- prefix 매칭입니다.
#
그 외에 알아둘 점- robots.txt가 발전함에 따라 다른 필드를 포함하는 경우가 있으나 이해를 못하는 경우는 무시합니다.
- 하위 호완성을 위해 한줄을 여러 줄로 나눠적은 것은 불가능합니다.
- 주석은 어디에서든 허용되며
#
으로 사용됩니다.
#
robots.txt의 캐싱과 만료- robots.txt를 계속 들고오는 것은 웹의 과부하를 만듦으로 캐싱하여 사용합니다.
#
로봇 차단 펄 코드- (코드 생략)
#
HTML 로봇 제어 META 태그- 로봇 차단 태그는 HTML META 태그를 사용하여 할 수 잇습니다.
- HEAD 섹션에 사용되어여야합니다.
이름 | 설명 | 예시 |
---|---|---|
NOINDEX | 로봇에게 처리하지 말고 무시하라고 말해줌 | <META NAME="ROBOTS" CONTENT="NOINDEX"> |
NOFOLLOW | 로봇에게 이 페이지가 링크한 페이지를 크롤링하지 말아라 | <META NAME="ROBOTS" CONTENT="NOFOLLOW"> |
INDEX | 로봇에게 이 페이지의 콘텐츠를 인덱싱해도 된다고 말해줌 | |
FOLLOW | 로봇에게 이 페이지가 링크한 페이지를 크롤링해도 된다고 말해줌 | |
NOARCHIVE | 로봇에게 이 페이지의 캐시를 위한 로컬 사본을 만들면 안된다고 말해줌 | |
ALL | INDEX, FOLLOW와 동일 | |
NONE | NOINDEX, NOFOLLOW와 같음 |
겁색엔진 META 태그
- DESCRIPTION, 웹페이즈의 짧은 요약
- KEYWORDS, 키워드 검색을 위한 페이지
- REVISIT-AFTER, 로봇이나 검색엔진에게 페이지가 쉽게 변경됨으로 일정 시간 이후는 다시 방문해야함을 알려줌
#
9.5 로봇 에티켓가이드라인
- 신원 식별 : 로봇의 신원, 기계의 신원, 연락처를 밝히기
- 동작 : 긴장, 대비, 감시와 로그, 배우고 조정
- 스스로 제한 : URL을 필터링, 동적 URL 필터링, Accept 관련 헤더로 필터링, robots.txt에 따르기, 스스로 억제하기
- 루프와 중복 견디기 : 모든 응답 코드 다루기, URL 정규화, 적극적으로 순환 피하기, 함정을 감시, 블랙리스트 관리
- 확장성 : 공간 이해, 대역폭 이해, 시간 이해, 분할 정복
- 신뢰성 : 철저히 테스트, 체크포인트, 실패에 대한 유연성
- 소통 : 준비, 이해, 즉각 대응
#
9.6 로봇 엔진- 웹 로봇을 가장 광범위하게 사용하는 것은 인터넷 검색엔진입니다.
#
넓게 생각하기- 검색엔지는 수십억 개의 웹페이지들을 검색하기 위해 복잡한 크롤러를 사용해야합니다.
- 순차적 처리는 엄청난 시간이 걸리므로 병렬적 처리가 필요합니다.
#
현대적인 검색엔진의 아키텍처- 풀 텍스트 색인이라고 하는 로컬 데이터베이스를 생성합니다.
- 검색엔진 크롤러들은 웹페이지들을 수집해서 집으로 가져오고, 풀 텍스트 색인에 추가합니다.
#
풀 텍스트 색인- 풀테스트 색인은 단어 하나를 입력받아 그 단어를 포함하고 있는 문서를 즉각 알려줄 수 있는 데이터베이스입니다.
#
질의 보내기- 사용자가 질의를 웹 검색엔진 게이트웨이로 보내는 방법은 HTML 폼을 사용자가 채워 넣고 브라우저가 그 폼을 HTTP GET이나 POST 요청을 이용해서 게이트웨이로 보내느 식입니다.
#
검색 결과를 정렬하고 보여주기- 검색엔진이 색인을 한번 사용했다면, 게이트웨이 애플리케이션은 그 결과를 이용해 최종 사용자를 위한 결과 페이지를 즉석에서 만들어 냅니다.
- 검색엔진은 결과에 순위를 매기기 위해 똑똑한 알고리즘을 사용합니다.
- 검색엔진이 웹 크롤링하는 과정에서 수집된 통계 데이터를 실제로 사용합니다.
#
스푸핑- 웹 사이트를 찾을 때 검색 결과의 순서는 중요합니다.
- 검색 엔진과 로봇 구현자들은 검색에서 나오는 속임수를 더 잘잡아내기 위해서 알고리즘을 수정해야합니다.