웹 로봇이란
사람과의 상호작용 없이 연속된 웹 트랜젝션들을 자동으로 수행하는 소프트웨어 프로그램이다.
9.1 크롤러와 크롤링
- 웹 크롤러 (스파이더)
- 크롤링을 반복하는 방식으로 웹을 순회하는 로봇
- 웹 페이지 한 개를 가져옴 → 그 페이지가 가리키는 모든 웹페이지를 가져옴 → 다시 그 페이지들이 가리키는 모든 웹 페이지를 가져옴
9.1.1 어디에서 시작하는가: '루트 집합'
- 루트 집합(root set)
- 크롤러가 방문을 시작하는 URL들의 초기 집합
- 일반적으로 좋은 루트 집합은 크고 인기 있는 웹 사이트, 새로 생성된 페이지들의 목록, 자주 링크되지 않은 잘 알려져있지 않은 페이지들의 목록으로 구성
9.1.2 링크 추출과 상대 링크 정상화
- 크롤러는 웹을 돌아다니면서 꾸준히 HTML 문서를 검색
- 검색한 각 페이지 안에 들어있는 URL 링크들을 파싱하여 크롤링할 페이지들의 목록에 추가 (새 링크 발견에 따라 급속한 목록 확장)
- 해결책 → 간단한 HTML 파싱으로 링크를 추출하여 절대 링크로 변환
9.1.3 순환 피하기
- 로봇들은 순환을 피하기 위해 반드시 그들이 어디를 방문했는지 알아야 함
9.1.4 루프와 중복
- 크롤러를 루프에 빠뜨려 꼼짝 못하게 함
- 웹 서버에 부담이 됨
- 크롤러의 애플리케이션에 쓸모없는 중복된 콘텐츠가 넘침
9.1.5 빵 부스러기의 흔적
- URL들은 굉장히 많기 때문에, 어떤 URL을 방문했는지 빠르게 판단하기 위해서는 속도와 메모리 사용 면에서 효과적인 자료 구조를 사용할 필요가 있음
- 웹 크롤러가 방문한 곳 관리를 위한 유용한 기법
- 트리와 해시 테이블
: URL을 빨리 찾아볼 수 있게 해주는 소프트웨어 자료 구조
- 느슨한 존재 비트맵
: 공간 사용 최소화를 위한, 존재 비트 여부에 따른 크롤링 유무 판단
- 체크포인트
: 로봇 프로그램의 갑작스런 중단에 대비한 URL 방문 목록 저장을 확인
- 파티셔닝
: 농장을 이용한 커뮤니케이션이 가능한 개별 로봇들의 사용
9.1.7 URL 정규화
- URL 형식 변환 방식
- 포트 번호가 명시되지 않았을 경우, 호스트 명에 :80 추가
- 모든 %xx 이스케이핑된 문자들을 대응되는 문자로 변환
#
태그 제거
9.1.8 파일 시스템 링크 순환
- 파일 시스템의 심벌릭 링크는 의미 없는 디렉터리 층을 반복해서 만들어낼 수 있음
- 루프 발견이 중요
9.1.9 동적 가상 웹 공간
- 악의적인 웹 마스터들의 복잡한 크롤러 루프 생성은 있을 수 있는 일
- URL과 HTML은 매번 전혀 달라보여 로봇이 감지하기 매우 어려움
9.1.10 루프와 중복 피하기
- 잘 설계된 로봇은 순환을 피하기 위해 휴리스틱의 집합을 필요로 함
- 약간의 손실을 유발할 가능성 있음
- 의심스러워 보이지만 유효한 콘텐츠를 걸러버릴 수 있는 일 발생
- 더 올바르게 동작하기 위해 사용되는 기법
- URL 정규화
: URL을 표준 형태로 변환
- 너비 우선 크롤링
: 깊이 우선이 아닌 너비 우선 크롤링으로 여전히 다른 웹 사이트에서 수십개의 페이지들을 받아올 수 있는 것
- 스로틀링
: 일정 시간동안 가져올 수 있는 페이지 숫자를 제한
- URL 크기 제한
: 일정 길이를 넘는 URL의 크롤링을 거부
- URL/사이트 블랙리스트
: 함정인 것으로 알려진 사이트와 URL 목록을 만들어 거부하고 피함
- 패턴 발견
: 둘, 셋 이상의 반복된 구성용소를 갖고 있는 URL 크롤링을 거절
- 콘텐츠 지문
: 페이지의 콘텐츠에서 몇 바이트를 얻어내어 체크섬을 계산, 이전에 확인한 체크섬을 가진 페이지라면 크롤링 거부
- 사람의 모니터링
: 사람이 쉽게 로봇의 진행 상황을 모니터링하여 즉각 인지할 수 있게끔 진단과 로깅을 포함하도록 설계하여 확인
9.2 로봇의 HTTP
- 로봇 역시 HTTP 명세의 규칙을 지켜야 함
- 적절한 HTTP 요청 헤더를 사용해야 함
9.2.1 요청 헤더 식별하기
- 로봇의 능력, 신원, 출신을 알려주는 기본적인 몇 헤더들을 사이트에게 보내주는 것이 좋음
- 권장되는 기본 신원 식별 헤더
- User-Agent
: 서버에게 요청을 만든 로봇의 이름
- From
: 로봇의 사용자/관리자의 이메일 주소 제공
- Accept
: 서버에게 어떤 미디어 타입을 보내도 되는지 말해줌
- Referer
: 현재 요청 URL을 포함한 문서의 URL을 제공
9.2.2 가상 호스팅
- Host 헤더를 지원할 필요가 있음
- 로봇들이 올바른 콘텐츠를 찾게 만들기 위함
9.2.3 조건부 요청
- 로봇이 검색하는 콘텐츠의 양을 최소화하는 것은 의미 있는 일
- ex) 인터넷 검색엔진 로봇
- 오직 변경되었을 때만 콘텐츠 가져오기
- 엔터티 태그를 비교함으로, 그들이 받아간 마지막 버전 이후, 업테이트 된 것이 있는지 알아보는 조건부 HTTP 요청 구현
9.2.4 응답 다루기
- 웹 탐색, 서버와의 상호작용을 더 잘해보려는 로봇들은 여러 종류의 HTTP 응답을 다룰 줄 알 필요가 있음
- 상태 코드
: 200, 404와 같은 HTTP 상태 코드에 해단 이해
- 엔터티
: HTTP 헤더에 임베딩된 정보를 따라 찾을 수 있으며, 유용한 정보들이 들어 있음
9.2.5 User-Agent 타기팅
- 그들의 여러 기능을 지원할 수 있도록 브라우저의 종류를 감지하여 그에 맞게 콘텐츠를 최적화 함
9.3 부적절하게 동작하는 로봇들
- 로봇들의 실수, 결과 몇가지
- 폭주하는 로봇
: 극심한 부하를 안겨줌 → 폭주 보호 장치에 신경 써 설계하는 것으로 해결
- 오래된 URL
: 웹 사이트가 콘텐츠를 많이 바꿨을 경우 불필요한 요청을 많이 보냄, 웹 서버의 요청에 대한 수용 능력이 감소됨
- 길고 잘못된 URL
: 웹 서버의 처리 능력에 영향을 주고, 고장을 일으킬 위험도 있음
- 호기심이 지나친 로봇
: 최악의 경우엔 사생활 침해, 민감한 데이터 포함 경우 → 해당 콘텐츠를 무시하는 메커니즘
- 동적 게이트웨이 접근
: 처리 비용이 많이 듦
9.4 로봇 차단하기
- robots.txt라는 선택적 파일 제공
- 해당 파일은 어떤 로봇이 서버에 어떤 부분에 접근할 수 있는지에 대한 정보
- 이 자발적인 표준에 따른다면, 리소스 접근 전 그 사이트의 robots.txt를 요청
- 이 과정을 통해 로봇을 차단
9.4.1 로봇 찿단 표준
- 임시방편으로 마련된 표준
- 불완전하지만 없는 것보다는 훨씬 낫고, 주류 업체, 검색엔진 크롤러들은 이 차단 표준 지원
9.4.2 웹 사이트와 robots.txt 파일들
- robots.txt 가져오기
- HTTP GET 메서드를 이용해 robots.txt 리소스 가져옴
- 로봇은 사이트 관리자가 접근을 추적할 수 있도록 From이나 User-Agent 헤더를 통해 신원 넘김
- 응답 코드
- 로봇은 robots.txt를 많은 웹사이트가 가지고 있지 않다는 것을 모름
- 로봇은 robots.txt 검색 결과에 따라 다르게 동작함
- 성공 응답 시 차단 규칙을 얻어 그 규칙을 따름
- 리소스가 존재하지 않다는 응답을 얻을 시 제약 없이 사이트에 접근
- 접근 제한으로 응답 얻을 시 접근은 완전히 제한되어 있다고 가정
- 요청 시도의 일시적인 실패일 경우 검색을 뒤로 미룸
- 리다이렉션을 의미하는 응답일 경우 리소스가 발견될 때까지 리다이렉션 따라감
9.4.3 robots.txt 파일 포맷
- robots.txt 파일은 매우 단순한 줄 기반 문법을 가짐
- 줄들은 레코드로 구분
- 줄 종류
- User-Agent 줄
: User-Agent: <robot-name>
, 줄을 찾지 못했다면 접근 제한 없음
- Disallow와 Allow 줄들
: User-Agent 줄들 바로 다음에 옴, 어떤 URL 경로가 명시적으로 허용, 금지 되어있는지 기술
9.4.5 robots.txt의 캐싱과 만료
- 매 파일 접근마다 robots.txt 파일을 새로 가져오면 효율성 떨어짐, 웹 서버 부하도 두 배
- → robots.txt의 캐시된 사본은 robots.txt가 만료될 때까지 로봇에 의해 사용
9.4.6 로봇 차단 펄 코드
- robots.txt 파일과 상호작용하는 공개된 펄 라이브러리
- RobotRules 객체 만들기
: $rules = WWW::RobotRules->new($robot_name);
- robots.txt 파일 로드하기
: $rules->parse($url,$content,$fresh_until);
- 사이트 URL을 가져올 수 있는지 검사
: $can_fetch = $rules->allowed($url);
- robots.txt 파일을 사이트 관리자가 로봇들을 웹 사이트 일부, 전체에 접근할 수 없게 함
- 로봇 차단 태그 형식
- 로봇 META 지시자
- NOINDEX
: 해당 페이지를 처리하지 말고 무시하라
- NOFOLLOW
: 해당 페이지가 링크한 페이지를 크롤링하지 마라
- INDEX
: 해당 페이지의 콘텐츠를 인덱싱해도 됨
- NOARCHIVE
: 해당 페이지를 위한 로컬 사본 생성은 안됨
- ALL
: = INDEX, FOLLOW
- NONE
: = NOINDEX, NOFOLLOW
- 검색엔진 META 태그
9.5 로봇 에티켓
9.6 검색엔진
- 웹 로봇을 가장 광범위하게 사용하는 것은 검색엔진
- 먹이 주듯 문서들을 가져다 주어, 검색엔진이 어떤 문서에 어떤 단어들이 존재하는지에 대한 색인을 생성할 수 있게 함
9.6.1 넓게 생각하라
- 대규모 크롤러가 자신의 작업을 완료하려면 많은 장비들을 똑똑하게 사용하여 요청을 병렬로 수행할 수 있어야 할 것
- 그러나, 그 규모로 인해 웹 전체 크롤링은 쉽지 않은 도전
9.6.2 현대적인 검색엔진의 아키텍처
- 오늘날 검색엔진, 전 세계 웹페이지들에 대한 풀 텍스트 색인이라고 하는 복잡한 로컬 데이터베이스 생성
- 웹의 모든 웹 문서에 대한 일종의 카드 카탈로그처럼 동작
- 과정
: 크롤러들이 웹 페이지들을 수집하여 집으로 가져옴 → 풀 텍스트 색인에 추가 + 웹 검색 게이트웨이를 통해 질의 보냄
9.6.3 풀 텍스트 색인
- 단어 하나를 입력받아 그 단어를 포함하고 있는 문서를 즉각 알려줄 수 있는 데이터베이스
- 해당 문서들은 색인 생성 후, 검색할 필요가 없음
- 풀 텍스트 색인은 각 단어를 포함한 문서를 열거
- 단어 'a'는 문서 A와 B에 들어 있음
- 단어 'best'는 문서 A와 C에 들어 있음
- 단어 the는 세 문서 A,B,C에 들어 있음
9.6.4 질의 모내기
- 사용자가 질의를 웹 검색엔진 게이트웨이로 보내는 방법, 이후
- HTML 폼을 사용자가 채워 넣고 브라우저가 그 폼을 HTTP GET, POST 요청을 통해 게이트웨이에 보내는 식
- 게이트웨이 프로그램은 검색 질의를 추출하고 웹 UI 풀 텍스트 색인을 검색할 때 사용되는 표현식으로 변환
- 게이트웨이는 웹 서버에게 문서의 목록을 결과로 알려줌
- 웹 서버는 결과를 사용자를 위한 HTML 페이지로 변환
9.6.5 검색 결과를 정렬하고 보여주기
- 검색엔진이 색인을 한번 사용했다면, 게이트웨이 애플리케이션은 그 결과를 이용해 결과 페이지를 즉석으로 생성 가능
- 검색엔진은 결과에 순위를 매기기 위한 똑똑한 알고리즘 사용
- 주어진 단어와 관련이 많은 순서대로 결과 문서에 나타낼 수 있도록 관련도 랭킹
9.6.6 스푸핑
- 웹 사이트를 찾을 때 검색 결과의 순서는 중요
- 속임수를 잡아내기 위한 끊임없는 관련도 알고리즘 수정이 필요