brunch

You can make anything
by writing

C.S.Lewis

누구나 할 수 있는 웹 데이터 수집 튜토리얼 - 서론

파이썬 Selenium 활용하기

*본 튜토리얼은 아래 깃허브 링크에 자료과 참고 코드를 업로드해두었습니다:

https://github.com/ethHong/Web-data-collection-tutorial


'웹 크롤링'이라는 분야가 참 애매하다. 자동으로 원하는 데이터를 착착 가져오는 멋진 작업이라고만 생각할 수도 있지만, 1) 절대로 모든 상황에 멋지고 쉽게 적용되는 '만능 크롤러'라는 것은 있기 힘들고, 2) 웹상에 있는 데이터들이라고 해서 무엇이든, 마음대로 가져다가 활용해도 되는가? 에 대한 문제도 존재한다. 


그렇지만, 실제로 많은 프로젝트 상황에서 '크롤링' 이 참 유용하게 사용되기도 한다. 오랫동안 많은 시행착오를 겪으면서, Python의 Selenium을 주로 사용해 프로젝트 상황에서 종종 사용했었고, 대학 연구실에서 프로젝트를 하며 후배들을 대상으로 짧은 튜토리얼을 진행한 적이 있다. 


그때의 내용을 바탕으로 개발이나 기술에 대한 지식이 상대적으로 적은, 전공자는 아니지만 어느 정도 컴퓨터를 배워 유용하게 프로젝트 상황에서 '웹 데이터 수집'을 효율적으로 (그리고 문제의 소지 없지) 하고 싶은 이들을 위해, 간단히 글을 적어보려고 한다. 


이번 서론에서는, 본격적인 크롤링 튜토리얼에 대해 이야기하기 앞서, '웹 크롤링'이라는 것 자체에 대해 짚고 넘어갈 부분들을 먼저 이야기해보도록 하겠다.


들어가기 앞서...


물론 몰라도 가능은 하겠지만, 다음 내용에 대해 간단히 알고 있으면 좋다:

웹을 이루는 기본적인 HTML / CSS / Javascript 에 대한 기본적인 지식 (HTML의 구조에 대해서만이라도 간단히 알고 있다면 좋다.)

Python 및 BeautifulSoup / urllib / Selenium 등의 라이브러리에 대해

아무래도 파이썬을 사용하기 때문에, 파이썬을 기본적으로 다룰 줄 안다는 전제하게 진행되겠다. 


웹에 존재하는 데이터

'크롤링' 이 정확히 뭔데?


그거 웹에서 크롤링해와서 쓰면 되지 않아?'


웹 크롤링' '스크래이핑'등... 여러 가지 프로젝트를 하다 보면 종종 듣게 되는 말이다. 회사이건 대학이건, 가끔씩 크롤링을 해서 필요한 데이터들을 쉽게 척척 모아주는 사람들을 한 명씩 종종 보게 된다. (물론 아무 데이터나, 어떤 상황에서든 마구마구 크롤링해와서 사용한다면 문제가 될 소지가 꽤 있다. 이 이야기는 뒤에서 하도록 하겠다.) 그러면 여기서 말하는 '크롤링'의 정확한 정의는 무엇일까?


삼성 디스플레이 뉴스룸에서 꽤 명쾌한 설명을 제시하고 있다. 

웹 스크래이핑 (Web Scraping):웹 상의 데이터를 자동화 프로그램으로 수집하는 방법

웹 크롤링 (Web Crawling):웹 페이지 상의 문서를 분류, 저장하는 것

파싱 (Parsing) : 데이터를 사용자가 원하는 형태, 일정 패턴으로 추출하는 것


과 같이 정의하고 있다. 우리에게 익숙한 크롤링이라는 단어의 정의가 다소 낯설게 느껴질지도 모르겠다. '웹 페이지를 수집한다니, 왜?'라고 생각할 수도 있지만, '웹 페이지 수집'은 실제로 '검색 엔진' 구축에 필수적인 원리를 구성한다. 구글이 작성한 Google 검색의 원리 문서에서도 자세히 설명하고 있듯, 검색 엔진이 하는 일은 기본적으로 수많은 웹 페이지들을 모으고, 색인을 통해 웹 페이지에 대한 정보를 구성해서, 모아둔 페이지들 중 가장 연관성 높은 페이지를 보여주는 일이다. 구글과 같은 검색 엔진이 가진 '크롤러'가 하는 일들은, 실제로 웹 상을 돌아다니며 (crawling) 페이지들을 모으는 것이다. 실제로 스탠퍼드 NLP 문서에서도 크롤러를 '검색엔진 구축을 위해 웹 페이지를 수집하는 프로그램'으로 설명하고 있다. 

출처: Stanford NLP


그런데 실제로 웹 크롤링과, 스크래이핑은 많이 혼동되어 사용된다고 한다. 아마도 웹상에서 수집하는 데이터는 거의 대부분이 '웹 페이지'로부터 나오기에, 웹 페이지를 수집하고 그 안의 제이터를 '파싱' 해서 사용하기 때문이지 않을까 싶다.


그럼 여기서, 웹 상의 데이터는 어떤 형태로 우리에게 보일까? 웹 상에서 우리가 보는 데이터들의 구조를 파악해야 원하는 데이터를 원하는 형태로 수집할 수 있다. 

웹의 구조

앱스토어 리뷰

여기에 우리에게 익숙한 앱스토어 리뷰 가 있다. 우리에게 이렇게 깔끔한 모양으로 보이기 전에, 누군가는 '앱스토어'라는 서비스의 뒷단에 일정한 형식으로 '데이터'를 가지고 있을 것이다. 예를 들면, 아래와 같이 '제목' / '내용' / '별점' / '일시' 등의 정보를 일정한 형식으로 정리할 수 있는 데이터로 말이다. 

물론 아래의 이미지는 '앱스토어 서비스'가 실제로 데이터베이스에 보유하고 있는 데이터와는 차이가 있을 것이다. 위 이미지는 '웹 상에 드러난 데이터'를 가지고 와서, 내가 필요한 정보만 모아 'JSON'이라는 파일 형태로 구성한 것이다. 

서비스 제공자는 어딘가 '서버 컴퓨터'에 웹페이지, 사이트, 앱 등을 개발해 저장한다. 이러한 서비스에 들어가는 데이터 역시 '서버 컴퓨터'에 저장하게 된다. 이것을 '서버 side'라고 한다. 반면 우리가 앱스토어에서 보는 데이터는 크롬, 인터넷 익스플로러, 등과 같은 '브라우저' 상에 보이는 데이터이다. 이것을 클라이언트 side라고 부른다. 웹 페이지가 어떤 모양으로, 어떻게 보일 것인가에 해당하는 '프런트엔드' 쪽을 구성하고, 데이터를 원하는 위치에 원하는 모습으로 보여주면 그 모습이 클라이언트에 나타난다. 클라이언트에서 특정 서비스, 혹은 사이트에 요청을 보내면 (예를 들어, 앱스토어 사이트에 접속하면), 서버에서 응답으로 데이터를 내려주게 되고 우리는 브라우저에서 이것을 보게 된다. 

즉, 우리는 서비스 제공자가 '소유한' 데이터를, 제공자의 의도대로 가공된 모습을 클라이언트 쪽에서 보게 된다. 그렇지만 모든 데이터를 다 볼 수 있는 것은 아니다. 회원가입, 로그인 등 특정 조건을 만족한 유저에게만 제한적으로 보여주는 데이터들이 있을 것이다. (e.g 구매한 이들에게만 노출되는 ebook과 같은 콘텐츠). 그러나 웹 상에는, '누구에게나 공개된' 데이터들이 매우 많으며, 이러한 데이터들을 잘 활용하면 일일이 검색하고 서치 하는 과정을 많이 단축할 수 있기에 크롤링을 많이 활용한다.



웹 크롤링을 시작하기 전에... 주의합시다!

그럼 웹 상의 데이터는 다 가져와도 되나요?


서비스 제공자들은 '서비스'를 제공할 목적으로 데이터를 활용하고, 제한적으로 보여주는 것이지 우리에게 데이터를 제공할 목적으로 데이터를 노출하는 것이 아니다. 그래서, (회원이나 구매자에게만 제공하는 제한적인 콘텐츠 등은 물론 말할 것도 없고!) 누구에게나 공개된 정보이더라도, 크롤링을 해왔을 때 문제의 소지가 될 여지가 없지 않다. 


사실 이 부분이 굉장히 애매한 부분이기는 하다.

누구에게나 공개된 웹 상의 정보 (e.g 구글에 검색하는 이미지, 누구나 볼 수 있는 뉴스, 그 외 많은 웹 서비스 상의 정보들)을 직접 일일이 찾아서 정보를 모으는 것에 대해 문제 삼는 것은 쉽지 않다. 그런데 자동화된 프로그램을 사용해서 좀 더 효율적으로 공개된 정보를 모아 오는 행위에 문제를 삼을 수 있다니, 기준이 애매한 것 같다. 그런제 법적으로 소유권을 주장할 수 있는 (특성 서비스 제공자의 DB에서 나온) 데이터인 경우 / 영리적으로 서비스 중인 사업체의 데이터인 경우에는 어떻게 수집하고 어떻게 사용하냐에 따라 문제의 소지가 될 수 있다. 출처가 되는 데이터의 소유자가 서비스를 목적으로 데이터를 공개할 때, 약관을 통해 '우린 너희가, 우리 서비스를 이용하는 목적에 한해서만 데이터를 공개하는 것이지, 데이터를 줘버린 게 아니야. 이 데이터는 우리가 수집하고 가공해서 우리의 DB에 보관하고 있어. 그러니 함부로 사용하면 약관 위반이고, 법적인 소송을 할 수 있어!'라고 명시하는 경우도 더러 있다.


실제 판례에서도, 경쟁사 서비스의 사이트를 크롤링해와 사용한 경우 법적인 책임을 물게 한 사례가 존재한다. 물론 이 경우는 '경쟁 업체'가, '영리적으로 서비스 중인 사업체의 데이터'를 활용했기에 문제가 된 점이 크다. 미국의 경우 오히려 영리적으로 서비스 중인 사업체이지만, 누구나 공연히 열람 가능한 상태의 데이터를 크롤링해 사용한 경우에 대해 소송한 사업체가 패소한 판례가 있다


그래서 써도 된다고? 아니면 안 된다고?

정리하자면 일단 공공연하게 열람이 불가능한 데이터 - 서비스 제공자가 가입 / 결제 등으로 권한을 부여한 이용자만 사용할 수 있는 웹 페이지 데이터 - 의 경우 문제 소지가 있을 수 있다고 본다. 더군다나, 영리적 목적으로 사용하는 등, 데이터의 소유권이나 저작권 문제를 일으킬만한 용도로 사용한다면 더더욱 위험이 크다. 그런데 여기서, '크롤러를 통해 정보를 수집해오는 것'과 '사람이 일일이 정보를 모아 오는 것'의 경계가 애매하다. 


'이 데이터는 개인정보나 저작권 문제도 없고, 공공연히 공개되어있는 정보라 우리가 일일이 하나씩 모으는 경우엔 문제가 안될 것 같은 에 크롤링해와도 될까?'

이런 경우 상대적으로 문제 소지가 될 가능성이 적지만, 서비스 차원에서 약관으로 '봇'의 접근을 금지하고 있다면 문제 소지가 될 수 있다. 법적인 문제까지는 아니더라도, IP 주소나, 로그인된 계정 등에 대해 서비스를 사용하지 못하도록 차단할 수도 있으니 조심하자. 대부분의 웹 서비스들은, '봇'의 접근을 어디까지 허용할 것인지에 대해 정의한 'Robots.txt (링크를 통해 구글에서 제공한 설명을 참조하자)' 문서를, 웹 서비스의 하위 url에 넣어둔다. 예를 들어, 내가 웹 크롤링을 하고 싶은 사이트 도메인이 'www.facebook.com'이라면, 'www.facebook.com/robots.txt'로 들어가 보자. 해당 웹 서비스의 모든 하위 경로에 대해, 어떤 종류의 '봇'에 대해 접근을 허용하는지 상세하게 명세되어있다. 


(물론 경험상, 많은 현직에 계신 분들이나, 교수님들도 '웹 상 공개된 공개를 크롤링해 사용하는 것' 에 대해 의견이 갈리는 경향이 있는 것 같지만, 개인적으로는 운영중인 서비스에 피해가 가지 않는 선에서 조심히 활용하는것이 좋지 않을까 싶다. )


'만능 크롤러'는 절대 (거의) 없다


다음 게시물에서부터 파이썬과 셀레늄을 활용한 크롤링을 본격적으로 다뤄보겠지만, 한 가지 알아둬야 할 것이 있다. 파이썬 라이브러리 등을 사용해, 코드를 짜서 데이터를 수집하는 방식은 케이스마다 자동화를 위해 코드를 짜 주어야 한자. 즉, 크롤러가 알아서 척척 내가 원하는 정보를 가지고 올 수는 웬만해선 절대 없다. 더군다나, 웹의 구조를 파악하고, 내가 원하는 정보가 있는 곳을 파악하여 정보를 가져오는 것이기 때문에, 웹의 구조나 주소, 데이터 등이 바뀐다면 한번 짜 놓은 코드를 그대로 다시 사용할 수 없게 된다. 


특히 요즘에는 웹서비스의 형태가 다양해지고, 동적으로 구현되면서 크롤링을 위한 코드를 짜는 작업이 생각보다 오래 걸리거나 쉽지 않은 경우도 많아서 웹 상에 데이터가 어떻게 들어가 있는지 구조를 빠르게 파악하는 것이 도움이 된다. 하다 보면 최대한 예외 케이스나 에러를 줄이고, 효율적으로 크롤링 코드를 구성하는 요령이 생기는 것 같다. 

정리하다면 이렇다. 1) 생각보다 프로젝트 상황에서 쓰이는 크롤링은 흔히 말하는 '막일 작업'이 많이 들어갈 수 있다... 2) 웹에 있는 데이터는 경우에 따라서 '빈집털이'가 될 수도 있다. 항상 주의하고, 운영 중인 서비스에 누가 되지 않는 선에서 활용하자!



다음 포스트에서는 본격적으로 파이썬 라이브러리를 활용한 웹 크롤링을 시작해보자!


매거진의 이전글 로또, 주사위, 자주 나온 수에 걸어야 할까?
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari