웹 스크래핑을 통한 데이터 추출 작업은 마치 사이트 운영자와 데이터 추출자 간에 법률적인 회색 지대에서 벌이는 영원한 추격전과 같습니다. 우리는 이번 연재를 통해 웹 스크래핑의 정의와 과정, 웹 스크래핑을 어렵게 만드는 요인들, 그리고 이것들을 해결할 수 있는 방안들을 짚어보고자 합니다.
웹 스크래핑의 정의
웹 스크래핑은 간단히 말해 웹 사이트에서 데이터를 추출하는 행위입니다. 사람이 직접 수작업으로 복사 + 붙여넣기 신공을 펼쳐 데이터를 긁어 모을 수 있지만, 이 방법은 지루한 작업이 반복됨으로서 업무의 능률을 떨어뜨린다는 단점을 안고 있습니다. 이러한 원시적인 방법은 데이터 추출 프로세스를 자동화하기 위해 구축된 여러 도구들과 라이브러리들의 전체 생태계를 정당화합니다. 자동화된 웹 스크래핑에서는 브라우저에 페이지를 렌더링하는 것이 아니라 자체 스크립트를 사용하여 서버로부터 오는 원시 응답을 구문 분석합니다. 이제부턴 “웹 스크래핑”을 “자동화된 웹 스크래핑”이라는 의미로 사용하도록 하겠습니다.
웹 스크래핑의 과정
스크래핑을 어렵게 만드는 요인들을 파헤쳐 보기 전에, 스크래핑 과정을 먼저 들여다 보겠습니다.
1. 육안 검사: 추출할 항목 찾기
2. 웹 페이지에 HTTP 요청하기
3. HTTP 응답 구문 분석
4. 관련 데이터 유지/활용
첫 번째 단계는 내장된 브라우저 도구(예: 크롬 및 파이어폭스 개발자 도구)를 사용하여 웹 페이지에서 필요한 정보의 위치를 찾아 구조와 패턴을 식별하는 것입니다.
다음 단계는 앞서 식별한 패턴을 기반으로 웹 페이지에 요청을 보내고, 응답된 구문에서 필요한 정보를 추출해내기 위한 스크립트를 논리적으로 구현하는 것입니다. 마지막 단계는 추출된 정보를 사전에 의도된 목적에 맞게 활용하는 것입니다.
이해를 돕기 위해 실제 유튜브에서 데이터를 수집해 보도록 하겠습니다. 유튜브 구독자 수 1, 2위를 달리고 있는 퓨디파이(PewDiePie)와 T-시리즈(T-Series)를 비교하는 프로젝트입니다. 간단한 구글 검색을 통해 소셜 블레이드(Social Blade)의 실시간 유튜브 구독자 수 카운트 페이지로 이동합니다.
육안 검사를 통해 구독자 수가 <p> 태그 안에 ID rawCount 라는 이름으로 존재한다는 것을 알 수 있습니다.
이 값을 추출하기 위해 간단한 파이썬 함수를 작성해 보겠습니다. 라이브러리는 HTML을 파싱하기 위해 BeautifulSoup을 사용합니다.
import requests
from bs4 import BeautifulSoup
def get_subscribers(url):
html = requests.get(url).content
soup = BeautifulSoup(html)
return soup.select('#rawCount')[0].text
컴파일 했을 때 현재의 구독자 수는 다음과 같이 나옵니다.
(수집 시점에 따라 결과값이 다르게 나올 수 있습니다.)
>>>get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime')
'80520035'
>>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime')
#T-series
'79965479'
엄청 간단하죠? 실패할 여지가 전혀 없어 보입니다.
수집의 난이도는 웹 사이트의 프로그래밍 방식과 웹 사이트 운영자의 의도에 따라 달라집니다. 웹 사이트 운영자들은 스크래핑 방지를 위해 다양한 장치들을 심어 놓는데, 어떤 것들은 쉽게 해결되는 반면 어떤 것들은 난공불락의 요새처럼 해결되지 않는 것들도 있습니다.
다음 포스팅에서는 스크래핑 방지를 위해 취할 수 있는 조치들이 무엇이 있는지 하나씩 나열해보고, 이것들을 해결할 수 있는 방안들에 대해서도 짚어보도록 하겠습니다.
========================
데이터 수집/정제/분석/시각화에서 최고의 서비스를 제공합니다.
지금 바로 홈페이지를 방문하셔서, 문의 요청해 주십시오!
Commentaires