brunch

매거진 데일리 R

You can make anything
by writing

C.S.Lewis

by 더기 Aug 29. 2016

R로 웹페이지 스크래핑을 해보자(rvest 패키지)

html로 생성된 웹사이트의 경우 rvest패키지로 스크래핑이 가능하다. 정말 쉽다.

이전에 학습해놓고 까먹어서 다시 한번 정리


read_html()
html_node() / html_nodes()
html_text()


이 3가지 함수만 알아두면 스크래핑이 가능하다.

예제로 네이버 tv캐스트 <청춘시대>에 올라온 동영상 목록들을 긁어와 보도록 한다



1 기본 문법

url_tvcast = "http://tvcast.naver.com/jtbc.youth"
#해당 url을 새로운 변수에 저장한다

html_tvcast = read_html(url_tvcast, encoding = "UTF-8")
#url에서 html파일을 읽어오고 저장한다

이제 html에서 우리가 추출하고자 하는 부분을 찾아야 한다.
크롬 개발자도구를 열고 찾아보니 <dt class = "title">이란 태그안에 제목이 들어가 있다.

#이런 형식 ㅇㅇ
<dt class = "tilte">
<a>
<tooltip>여기에 제목이 있넹</tooltip>
</a>
</dt>

html_node() / html_nodes() 함수는 css, xpath로 원하는 부분을 추출할 수 있다.
tag, class, id 모두로 찾을 수 있다는 말이다.


*html_node()와 html_nodes()의 차이점

html_node()는 매칭되는 한 요소만 반환하고, html_nodes()는 모든 요소를 반환한다.
id를 찾을 경우에는 html_node()를 사용하면 되고. tag, class로 같은 요소를 모두 추출하고자 할 경우에는 html_nodes()를 사용하면된다.

여기서는 class가 title인 요소들 전부를 추출하니까 html_nodes()로 추출해본다

html_tvcast %>% html_nodes(".title a")  
#class가 title인 부분에서 안에 있는 a태그에 해당하는 내용을 추출한다

html_tvcast %>% html_nodes(".title a") %>% html_text()
#그 안에 있는 text만 추출한다

tvcast_df = html_tvcast %>% html_nodes(".title a") %>% html_text() %>% data.frame()
#데이터프레임으로 바꿔주고 저장한다



2 table 추출

웹 상에 <table> 태그로 존재하는 요소를 table(표) 그대로 가져올 수 있다.
http://en.wikipedia.org/wiki/Student%27s_t-distribution
이 페이지에 table 태그로 된 표가 있는데. html_table()을 이용해서 표 그대로 가져올 수 있다.

이 표를 그대로 가져와보자
table의 class명
html_wiki %>% html_nodes(".wikitable") %>% html_table()
#table의 class명인 "wikitable을 이ㅇ해서 가져온다"


3. 기타 다른 함수들

html_text() #텍스트를 추출한다
html_name() #attribute의 이름을 가져온다
html_children() #해당 요소의 하위 요소를 읽어온다.
html_tag() #tag이름 추출

html_attrs() #attribute을 추출한다


*attribute이 뭐냐면 (나도 몰라서 검색해봤다)



4. rvest로 불러올 수 없는 페이지들

rvest로 모든 페이지를 스크래핑할 수 있으면 좋겠지만. 자바스크립트로 생성된 페이지의 경우에는 다른 방법을 써야한다. Phantom.js + rvest / RSelenium을 사용하면 데이터를 가져올 수 있을 것 같다. 곧 공부하고 블로그에 포스팅할 예정.



CONTACT

<더기 Facebook>




매거진의 이전글 R에서 json을 dataframe으로, csv로
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari