Skip to main content

9. 웹 로봇

자동으로 웹 사이트들을 탐색하며 그 방식에 따라 '크롤러', '스파이더', '웜', 봇' 등의 다양한 이름으로 불립니다.

9.1 크롤러와 크롤링#

  • 웹 크롤러는 웹 페이지 하나를 가져오고, 그 다음 그 페이지가 가리키는 모든 웹페이지를 가져오는 일 등을 재귀적으로 반복하는 방식으로 웹을 순회하는 로봇
  • 인터넷 검색엔진은 웹을 돌아다니면서 그들이 만나는 모든 문서를 끌어오기 위해 크롤러를 사용합니다.

어디에서 시작하는가: '루트 집합'#

크롤러를 풀기 위해서는 출발지점을 주어야하며, 크롤러가 방문을 시작하는 URL들의 초기 집합을 루트 집합(root set) 이라고 부릅니다.

image

일반적으로 좋은 루트 집합은 크고 인기 있는 웹 사이트, 새로 생성된 페이지들의 목록, 자주 링크되지 않는 잘 알려져있지 않은 페이지들의 목록으로 구성됩니다.

링크 추출과 상대 링크 정상화#

크롤러는 웹을 돌아다니면서 꾸준히 HTML 문서를 검색하며, 각 페이지안의 URL 링크를 파싱하여 크롤링 페이지들의 목록에 추가합니다.

순환 피하기#

로봇들은 순환을 피하기 위해서 반드시 그들이 어디를 방문했는지에 대해 알아야합니다. 순환은 로봇을 함정에 빠트려 멈추게나 혹은 진행을 느리게 합니다.

루프와 중복#

순환은 크롤러에게 다음의 단점을 제공합니다.

  • 순환은 크롤러를 루프에 빠뜨려서 꼼짝 못하게 합니다.
  • 크롤러가 같은 페이지를 반복해서 가져오면 웹 서버의 부담이 됩니다.
  • 비록 루프 자체가 문제가 되지 않아도, 많은 수의 중복된 페이지(dups)들을 가져오게 됩니다.

빵 부스러기의 흔적#

전세계의 웹 URL을 방문했는지 추적하려면 복잡한 자료구조를 사용할 필요가 있으며, 이 자료 구조는 속도와 메모리 사용 면에서 효과적이어야합니다.

  • 트리와 해시 테이블 : 복잡한 로봇의 경우, 검색 트리나 해시 테이블의 사용합니다.
  • 느슨한 존재 비트맵 : 공간 사용을 최소화하기 위해 몇몇 대규모 크롤러들은 존재 비트 배열과 같은 느슨한 자료 구조를 사용합니다.
  • 체크 포인트 : 로봇의 갑작스러운 중단에 대비해 방문한 URL 목록이 디스크에 저장되었는지 확인합니다.
  • 파티셔닝 : 웹이 성장하면서 한 대의 컴퓨터에서 하나의 로봇이 크롤링이 불가능하므로, 몇몇 대규모 웹 로봇은 농장(farm)을 이용하며 각 로봇은 URL들의 특정 '한 부분'이 할당되어 그에 대한 책임을 집니다.

별칭(alias)과 로봇 순화#

올바른 자료 구조가 있더라도 URL이 별칭을 가질 수 있는 이상, 이를 방문했는지에 대해 쉽지 않을 때가 있습니다.

URL 정규화#

대부분의 웹 로봇은 URL들이 표준 형식으로 정규화함으로써 다른 URL과 같은 리소스를 가리키고 있음이 확실한 것들을 미리 제거하려고 시도합니다.

  1. 포트 번호가 명시되지 않았다면, 호스트 명에 ':80'을 추가합니다.
  2. 모든 %xx 이스케이핑된 문자들을 대응하는 문자로 변환합니다.
  3. #태그들을 제거합니다.

파일 시스템 링크 순환#

  • 파일 시스템의 심벌릭 링크는 의미도 없고, 깊어지는 디렉터리 계층이 생길 수 있습니다, (교묘한 종류의 순환)
  • 이러한 루프를 발견하지 못하면 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 가져오기#

GET /robots.txt HTTP/1.0
Host: www.joes-hardware.com
User-Agent: Slurp/2.0
Date: Wed Oct 3 20:22:48 EST 2001

응답하기#

  • 많은 사이트는 robots.txt를 가지고 있지않습니다. 따라서 robots.txt의 검색 결과에 따라 다르게 동작합니다.
  • 리소스가 존재시 차단 규칙에 의거하여 동작합니다.
  • 리소스가 없으면 차단 규칙이 존재하지 않다고 가장하고 사이트에 접근합니다.
  • 401, 403 에러시 사이트 접근을 제한한 것으로 이해합니다.
  • 503 에러는 나중에 다시 검색합니다.
  • 3XX 인 겨우, 리다이렉트를 따라갑니다.

robots.txt 파일 포맷#

대표적인 예시는 다음과 같습니다.

User-Agent: slurp
User-Agent: webcrawler
Disallow: /private
User-AGENT: *
Disallow:
  • 각 라인은 레코드로 분리됩니다.
  • User-Agent로 시작되며 그 후로 AllowDisallow 줄이 옵니다.

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로봇에게 이 페이지의 캐시를 위한 로컬 사본을 만들면 안된다고 말해줌
ALLINDEX, FOLLOW와 동일
NONENOINDEX, NOFOLLOW와 같음

겁색엔진 META 태그

  • DESCRIPTION, 웹페이즈의 짧은 요약
  • KEYWORDS, 키워드 검색을 위한 페이지
  • REVISIT-AFTER, 로봇이나 검색엔진에게 페이지가 쉽게 변경됨으로 일정 시간 이후는 다시 방문해야함을 알려줌

9.5 로봇 에티켓#

가이드라인

  • 신원 식별 : 로봇의 신원, 기계의 신원, 연락처를 밝히기
  • 동작 : 긴장, 대비, 감시와 로그, 배우고 조정
  • 스스로 제한 : URL을 필터링, 동적 URL 필터링, Accept 관련 헤더로 필터링, robots.txt에 따르기, 스스로 억제하기
  • 루프와 중복 견디기 : 모든 응답 코드 다루기, URL 정규화, 적극적으로 순환 피하기, 함정을 감시, 블랙리스트 관리
  • 확장성 : 공간 이해, 대역폭 이해, 시간 이해, 분할 정복
  • 신뢰성 : 철저히 테스트, 체크포인트, 실패에 대한 유연성
  • 소통 : 준비, 이해, 즉각 대응

9.6 로봇 엔진#

  • 웹 로봇을 가장 광범위하게 사용하는 것은 인터넷 검색엔진입니다.

넓게 생각하기#

  • 검색엔지는 수십억 개의 웹페이지들을 검색하기 위해 복잡한 크롤러를 사용해야합니다.
  • 순차적 처리는 엄청난 시간이 걸리므로 병렬적 처리가 필요합니다.

현대적인 검색엔진의 아키텍처#

  • 풀 텍스트 색인이라고 하는 로컬 데이터베이스를 생성합니다.
  • 검색엔진 크롤러들은 웹페이지들을 수집해서 집으로 가져오고, 풀 텍스트 색인에 추가합니다.

풀 텍스트 색인#

  • 풀테스트 색인은 단어 하나를 입력받아 그 단어를 포함하고 있는 문서를 즉각 알려줄 수 있는 데이터베이스입니다.

질의 보내기#

  • 사용자가 질의를 웹 검색엔진 게이트웨이로 보내는 방법은 HTML 폼을 사용자가 채워 넣고 브라우저가 그 폼을 HTTP GET이나 POST 요청을 이용해서 게이트웨이로 보내느 식입니다.

검색 결과를 정렬하고 보여주기#

  • 검색엔진이 색인을 한번 사용했다면, 게이트웨이 애플리케이션은 그 결과를 이용해 최종 사용자를 위한 결과 페이지를 즉석에서 만들어 냅니다.
  • 검색엔진은 결과에 순위를 매기기 위해 똑똑한 알고리즘을 사용합니다.
  • 검색엔진이 웹 크롤링하는 과정에서 수집된 통계 데이터를 실제로 사용합니다.

스푸핑#

  • 웹 사이트를 찾을 때 검색 결과의 순서는 중요합니다.
  • 검색 엔진과 로봇 구현자들은 검색에서 나오는 속임수를 더 잘잡아내기 위해서 알고리즘을 수정해야합니다.
Last updated on