top of page

[연재 | 데이터 스크래핑<2>] 웹 스크랩핑이 간단하지 않은 이유




비동기 로딩 및 클라이언트 사이드 렌더링

보이는 대로 데이터를 100% 수집할 수 있는 것은 아닙니다. 개발자가 자바 스크립트가 많은 웹사이트의 데이터를 수집할 때 흔히 겪는 문제입니다. 서버에서 응답받은 정보로는 보이는 대로 데이터가 수집 가능한지 알지 못할 수도 있습니다.

수집하고자 하는 데이터가 핸들바(Handlebars)나 리액트(React)와 같은 라이브러리로 브라우저에 렌더링 되었거나 AJAX 호출을 하고 난 다음에 브러우저에서 렌더링 하기 때문에 발생하는 문제입니다.

이러한 예는 다음과 같습니다.

- 무한 스크롤이 가능한 웹 페이지 (Twitter, Facebook 등)

- 백분율 막대 또는 로딩 스피너와 같이 먼저 로딩 되는 페이지가 있는 웹 페이지





인증

인증을 거쳐야 웹스크래핑이 가능한 웹사이트가 많습니다. 아이디와 패스워드를 입력하거나 쿠키를 저장하는 등 간단한 경우도 있으나 다음과 같이 간단하지 않은 경우도 있습니다.

- 숨긴 값: 아이디와 비밀번호 외에 다른 데이터를 추가로 제공해 주어야 합니다. 보통의 경우 CSRF_TOKEN 이지만 그렇지 않을 수도 있습니다.

- 헤더 설정: 헤더 설정값을 지정해 주어야 하는 경우가 있습니다. (참조값, 권한 등)

서버에서 다음과 같은 응답 코드를 받으면 스크래핑을 하기 전에 먼저 인증을 받아야 한다는 의미 일 수도 있습니다.


HTTP 상태코드 의미

401 인증전

403 금지

407 프록시 인증 필요

서버-사이드 블랙리스트

앞에서 설명했듯이, 웹사이트에 따라 웹스크래핑이 불가능 할 수도 있습니다. 들어오는 트래픽과 탐색 패턴을 분석하여 자동화 프로그램이 웹사이트를 탐색하지 못하도록 하는 스크래핑 방지 매커니즘이 서버에 설정되어 있을 수도 있습니다.

스크래핑 방지 매커니즘이 트래픽과 탐색 패턴을 어떻게 분석하는지 알아보겠습니다.

데이터 요청 비율 분석

서버가 클라이언트로부터 단위 시간 안에 너무 많은 요청을 받으면 그 클라이언트는 자동화 프로그램일 가능성이 높습니다. 또한 단일 IP에서 많은 요청을 동시에 받을 경우는 더욱더 그러합니다.

또 하나의 기준은 반복 정도 입니다. (클라이언트는 Y초마다 X번 요청을 합니다.) 서버는 이러한 반복 정도를 측정하고 특정 반복 기준을 넘는 클라이언트의 탐색을 막습니다. 실제 매커니즘은 훨씬 더 복잡하지만 간단하게 설명해 보았습니다. 웹은 누구에게나 개방되어 있어야 하기 때문에 특정 클라이언트가 탐색을 하지 못하도록 금지하는 것은 일반적으로 일시적인 조치이나 경우에 따라 서버가 특정 클라이언트의 탐색을 영구 금지 시킬수도 있습니다.

헤더 확인

몇몇 웹사이트에서는 요청한 헤더를 검사하는 자동화 프로그램을 탐지 기술을 적용하고 있습니다. 서버가 받은 헤더 필드값을 실제 사용자가 보내는 헤더 필드값과 비교합니다.

예를 들어, 어떤 도구나 라이브러리는 서버에 요청을 하는 동안 특정 유저에이전트를 작동시키기 때문에, 서버는 특정 유저에이전트만 선택적으로 허용하고 나머지는 필터링 하기도 합니다. 또한 어떤 웹사이트는 유저에이전트에 따라 다른 내용을 제공하여 스크래핑을 불가능하게 하기도 합니다.

함정 설치

웹사이트 관리자는 실제 사람 이용자가 볼 수 없도록 특정 링크의 CSS를 display: none으로 설정하여 함정을 설치한 다음, 어떤 클라이언트가 특정 링크에 대한 요청을 보내면, (사람 이용자는 이 링크가 보이지 않기 때문에 링크에 대한 요청을 할 수 없음) 이 클라이언트를 자동화 프로그램으로 판단하고 해당 클라이언트의 웹사이트 탐색을 차단합니다.

패턴 감지

웹사이트의 정상적인 탐색 패턴(클릭 빈도나 요청 사이의 시간 간격, 클릭 위치 등)을 미리 정의합니다. 어떤 클라이언트가 이 탐색 패턴에서 벗어나면 서버가 해당 클라이언트에게 다음과 같은 응답 코드를 보냅니다.

HTTP 상태 코드 의미

503 서비스를 이용할 수 없습니다.

429 너무 많은 요청을 하였습니다.

403 금지

리다이랙션과 캡차

어떤 웹사이트는 특정 클라이언트가 자동화 프로그램이라고 판단되면 원래 링크를 3xx 응답 코드와 함께 해당 링크(http 링크를 https로 리다이랙트 하는 것처럼)로 리다이랙트(redirect) 합니다.

또한, 자동화 프로그램으로 의심되는 클라이언트를 판단하기 위해서, 서버는 사람만이 플수있는 캡챠(captcha)가 포함된 페이지로 리다이랙트 합니다.

봇과 DDoS 공격으로부터 웹사이트를 보호하는 서비스 Cloudflare를 이용하는 웹사이트는 스크래핑이 더 어려울 수 있습니다.

복잡한 구조

탐색이 복잡한 경우

때로는 웹사이트의 모든 페이지에서 정보를 수집하기 어려울 수도 있습니다. 예를 들어, 각 페이지가 고유한 URL을 갖고 있지 않거나 고유한 URL을 갖고 있더라도 페이지를 넘기는 규칙이 없어, 페이지를 넘기면서 각각의 페이지에서 정보를 수집하는 프그래밍이 불가능 할 수도 있습니다.

정형화 되지 않은 HTML

서버가의 매번 다른 패턴을 가진 HTML을 전송하는 경우 입니다. 예를 들어, CSS 클래스와 속성을 서버가 동적으로 매번 다르게 생성합니다. 이런 동적 구조를 갖는 html의 정보를 수집하는 프로그래밍은 작동하지 않을 확률이 매우 큽니다.

iflame 태그

다른 외부 소스를 iframe 태그로 컨텐츠를 렌더링 하여 보여주는 웹사이트가 있습니다.


iframe tags

이번 두번째 포스팅에서는 웹스크래핑으로 데이터를 수집하기 복잡한 경우를 설명해 보았습니다. 다음 포스팅에는 스크래핑이 복잡한 경우를 어떻게 해결 하는지, 그 해결 방법에 대해 이야기 해 보도록 하겠습니다.


=========================

데이터 수집/정제/분석/시각화에서 최고의 서비스를 제공합니다.

지금 바로 홈페이지를 방문하셔서, 문의 요청해 주십시오!








Comentarios


bottom of page