2022년 7월 ~ 2022년 8월 동안 http 완벽 가이드 스터디를 진행하면서 노션에 정리해놨던 내용입니다.
💡 웹 로봇은 사람과의 상호작용 없이 연속된 웹 트랜잭션들을 자동으로 수행하는 소프트웨어 프로그램이다.
웹 크롤러는 웹 페이지를 가져오고, 그 페이지들이 가리키는 모든 웹페이지들을 가져오는 일을 재귀적으로 반복하는 방식으로 웹을 순회하는 로봇이다.
검색엔진은 크롤러를 사용한다. 검색엔진이 크롤링한 문서들이 사용자가 검색 가능한 데이터베이스로 만들어진다.
크롤러를 풀어놓기 전에 출발지점을 주어야한다.
웹의 대부분을 커버하기 위해 루트 집합에 너무 많은 페이지가 있을 필요는 없고, 위의 예시로 봤을 때 루트 집합에는 A, G, S 가 루트 집합에 있기만 하면 모든 페이지에 도달할 수 있다.
크롤러는 웹을 돌아다니면서 HTML 문서를 검색하고, 검색한 각 페이지 안에 들어있는 URL링크를 파싱해 크롤링할 페이지들의 목록에 추가해야한다.
크롤링을 할 때 루프나 순환에 빠지지 않도록 어디 방문했는지 처리를 해야한다.
위의 예시같은 경우에는 A, B, C, A, B, C…. 순환이 생긴다.
수억개의 URL은 많은 공간을 차지한다. 만약 평균 URL이 40바이트 길이이고, 웹 로봇이 5억개의 URL을 크롤링 했다면, 검색 데이터 구조는 이 URL들을 유지하기 위해 20GB 이상의 메모리를 요구할 것이다.
복잡한 로봇이라면 방문한 URL을 추적하기 위해 검색 트리나 해시 테이블을 사용했을 수도 있다.
공간 사용을 최소하하기 위해, 존재 비트 배열(presence bit array)과 같은 느슨한 자료구조를 사용한다.
로봇 프로그램 중단에 대비해 방문한 URL목록이 디스크에 저장되었는지 확인함
한 대의 컴퓨터에서 하나의 로봇이 크롤링을 완수하는 것이 불가능
그래서 대규모 웹들은 각각이 여러 컴퓨터 로봇이 동시에 일하고 있는 농장(fram)을 이용한다. 각 로봇엔 URL들의 특정 한 부분이 할당되어 그에대한 책임을 진다.
올바른 자료구조에 방문 처리를 하더라도 URL이 별칭을 가질 수 있기 때문에 어떤 페이지를 이전에 방문했는지 알기 쉽지 않을 때도 있다.
URL을 표준 형식으로 정규화해서 다른 URL과 같은 리소스를 가리키고 있음이 확실한 것들을 미리 제거하려고 시도한다.
표 9-1의 d~f같은 문제들을 제거하기 위해서는 웹 서버에대한 지식이 있어야한다.
로봇들은 다른 클라이언트 프로그램과 다르지 않음. 웹로봇도 HTTP요청 헤더를 사용해야 한다.
웹로봇은 신원 식별 헤더를 전송한다.
그 이유는? 잘못된 크롤러의 소유자를 찾아낼 때와 서버에게 로봇이 어떤 종류의 콘텐츠를 다룰 수 있는지에 대한 약간의 정보를 줄 때 유용하기 때문
서버에게 요청을 만든 로봇의 이름을 말해준다.
로봇은 사용자/관리자의 이메일 주소를 제공한다
서버에게 어떤 미디어 타입을 보내도 되는지 말해준다.
현재의 요청 URL을 포함한 문서의 URL을 제공한다.
로봇 구현자들은 Host 헤더를 지원할 필요가 있다. 요청에 Host 헤더를 포함하지 않으면 로봇이 어떤 URL에 대해 잘못된 콘텐츠를 찾게 만든다.
두 개의 사이트(www.joes.hardware.com, www.foo.com)를 운영하는 서버에 host헤더를 포함하지 않고 요청을 보냈을 때, 서버가 기본적으로 www.joes.hardware.com 를 제공하도록 설정되어 있다면 www.foo.com페이지에 대한 요청은 www.joes.hardware.com에 대한 콘첸츠를 얻게 되고, 크롤러는 이를 구분할 수 없다.
캐시 사본이 유효한지 검사할 때 사용하는 조건부 GET을 사용해서 변경되었을 때만 콘텐츠를 가져오도록 하낟.
로봇은 상태 코드를 다룰 수 있어야 한다. 몇몇 서버는 에러를 기술하는 메세지조차 200 ok로 응답하기도 한다.
웹 관리자는 로봇들로부터의 요청을 예상해야 한다. 웹 사이트는 브라우저늬 종류를 감지하여 그에 맞게 콘텐츠를 최적화한다. 웹 로봇이 사이트에 방문했다가 콘텐츠를 얻을 수 없는 일이 없도록 대비해야 한다.
로봇은 웹 서핑을 하는 사람보다 빠르게 HTTP요청을 만들 수 있고, 빠른 네트워크 연결을 갖춘 컴퓨터 위에서 동작한다. 그러기 때문에 로봇이 논리적인 에러를 갖고 있거나 순환에 빠졌다면 웹 서버에 극심한 부하를 안겨줄 수 있다. 그래서 로봇 저자들은 폭주 방지를 위한 보호 장치를 반드시 신경써야한다.
로봇은 url의 목록을 방문하는데 이 목록이 오래돼어 콘텐츠가 바뀌었다면 로봇은 존재하지 않는 url에 대한 요청을 많이 보낼 수 있다.
순환이나 프로그래밍상 오류로 로봇은 웹 사이트에게 크고 의미없는 url을 요청할 수 있다. 만약 url이 충분히 길다면 웹 서버의 처리능력에 영향을 주고, 로그를 어지럽히고 장애를 발생시킬 수 있다.
사적인 데이터에 대한 url을 얻어 그 데이터를 인터넷 검색엔진이나 기타 애플리케이션을 통해 쉽게 접근할 수 있도록 만들 수도 있음.
하이퍼링크가 존재하지도 않는 문서들을 리덱터리의 콘텐츠를 가져오는 방법 등으로 긁어올 때 일어날 수 있음.
로봇이 웹 서버에 요청할 때 페이지를 가져올 수 있는 권한이 있는지 확인하기 위해 robot.txt파일을 가져와서 확인한다.
💡 User-Agent: robot-name
이 이름을 가진 로봇을 허용한다.
어떤 경로가 허용되고, 어떤 경로가 허용되지 않았는지 명시함.
robot.txt의 파일 소유권은 웹 사이트 관리자에게 있다. 그래서 각 HTML 저가가 로봇이 개별 페이지에 접근하는 것을 제한하기 위한 HTML META태그가 존재한다.
로봇에게 이 페이지를 처리하지 말고 무시하라고 말해줌
<META NAME="ROBOTS" CONTENT="NOINDEX">
로봇에게 이 페이지가 링크한 페이지를 크롤링하지 말라고 말해준다.
<META NAME="ROBOTS" CONTENT="NOFOLLOW">
로봇에게 이 페이지의 콘텐츠를 인덱싱해도 된다고 말해줌
로봇에게 이 페이지가 링크한 페이지를 크롤링해도 된다고 말해줌
로봇에게 이 페이지의 캐시를 위한 로컬 사본을 만들어서는 안 된다고 말해줌.
INDEX, FOLLOW와 같음
NOINDEX, NOFOLLOW와 같음.
웹 로봇이 제일 많이 사용되는 곳이 검색엔진
오늘날 검색엔진들은 ‘풀 텍스트 색인'이라고 하는 로컬 데이터베이스를 생성한다.
단어 하나를 입력받아 그 단어를 포함하고 있는 문서를 즉각 알려줄 수 있는 데이터베이스
사용자가 질의를 웹 검색엔진 게이트웨이로 보내는 방법