우리가 실제로 데이터를 분석하고자 할 때, 요즘 대세는 인터넷의 방대한 데이터를 마이닝하는 것이라고 할 수 있습니다. 이를 위해서는 웹페이지의 내용들 중 우리가 원하는 방법으로 변형하거나 추출하는 web scraping스킬이 필요합니다. 사실 일단 우리가 인터넷 페이지의 내용을 우리가 사용하는 프로그래밍 언어로 불러들일수만 있다면, 그것들을 이용하여 코드를 짜고, 데이터로 만들 수 있을 것입니다.

기본적으로 웹 페이지는 HTML언어로 되어 있습니다. 흔히들 ‘<html>, <a href>‘이런 코드들을 보셨을 것입니다. 이러한 규칙적인 문법으로 되어 있는 것이 웹페이지이기 때문에, 이는 우리가 구조만 잘 파악하면 쉽게 내용을 뽑아낼 수 있다는 것이겠죠?

다양한 라이브러리들이 존재하겠지만, 일단 제가 이해하기에 가장 직관적이었던 라이브러리를 소개할까 합니다.(물론 속도도 빠르구요 ^^)

>>> from lxml import html
>>> import requests

위의 lxmlrequests라는 라이브러리인데요, requests는 기본적으로 웹페이지를 가져오는 목적으로 사용되고, lxml은 가져온 html 코드를 가지고 parsing하는 데에 사용됩니다. 그럼 New York Times의 기사 하나를 가져와 보겠습니다. requests.get함수를 이용하여 손쉽게 가져올 수 있습니다.

>>> page = requests.get('http://www.nytimes.com/2015/04/08/us/south-carolina-officer-is-charged-with-murder-in-black-mans-death.html?hp&action=click&pgtype=Homepage&module=a-lede-package-region&region=top-news&WT.nav=top-news&_r=0')

이렇게 가져오고 나서는 page.text라는 attribute에 페이지의 코드들이 저장되게 됩니다.

>>> type(page.text)
unicode
>>> len(page.text)
174649
>>> page.text[:50] #html코드의 문자 50개를 출력해 보겠습니다.
u'<!DOCTYPE html>\n<!--[if (gt IE 9)|!(IE)]> <!--> <h'

이제 코드를 가져왔으니, lxml라이브러리를 사용해서 parsing을 해보겠습니다. lxml.html 안에는 fromstring이라는 함수가 있는데, 이를 통해서 html코드를 Element라는 클래스 구조로 치환하게 됩니다. 자세한 것은 차차 알아가셔도 되지만, 기본적으로 구조를 분석하여 우리가 뽑아내기 쉽게 변환해준다고 생각하시면 되겠습니다.

tree = html.fromstring(page.text)

그럼 이제 어떻게 우리가 원하는 것을 뽑아낼 수 있을까요? 웹페이지에는 많은 광고나 링크 등 우리가 원하지 않는 정보들이 많이 속해있습니다. 이것들을 어떻게 하면 걸러내고 본문만 읽어올 수 있을까요? 바로 Xpath라는 것을 이용하는 것입니다. 소위 말해서 각 html부분의 주소?나 항렬?을 따져서 원하는 녀석을 끄집어 낸다는 말입니다. 코드를 보시면 본문쪽의 내용은 //*[@id="story-body"]/p라는 Xpath에 존재하게 되는데요, 여기서 text()부분만을 원하기 때문에 이 부분을 뽑아서 오면 됩니다.

>>> contents = tree.xpath('//*[@id="story-body"]/p/text()')
>>> print len(contents)
31
>>> print contents[0]
WASHINGTON   A white police officer in North Charleston, S.C., was charged with murder on Tuesday after a
>>> print contents[-1]
At the roast, Mr. Scott got to do two of the things he enjoyed most: tell jokes and dance. When one of Mr. Scotts favorite songs was played, he got excited. He jumped up and said, Thats my song, and he danced like never before, his brother said.

잘 끄집어 왔음을 확인할 수 있죠?? 저도 웹 언어에 대해서는 무지해서 갈길이 멉니다만, 그래도 뭔가 작은 성과를 이뤄서 참 뿌듯합니다 :)