웹데이터 스크래핑

나는 주로 python과 beautifulsoup을 써서 웹데이터를 가져온다. 때에 따라서(간단한 것들) R을 직접 사용하는 것이 더 편리하고 좋다.

install.packages("rvest")
library(rvest)
lego_movie <- html("http://www.imdb.com/title/tt1490017/")
lego_movie %>% html_node("strong span") %>% html_text() %>% as.numeric()
lego_movie %>% html_nodes("#titleCast .itemprop span") %>% html_text()
lego_movie %>% html_nodes("table") %>% .[[3]] %>% html_table()
# 3번째 table

# XPath를 쓰려면...
# html_nodes(doc, xpath = "//table//td")).
# html_tag(), html_text(), html_attr(), html_attrs()
# guess_encoding(), repair_encoding()
# html_session(), jump_to(), follow_link(), back(), forward()
# html_form(), set_values(), submit_form()
# demo(package="rvest")



html() 함수는 웹데이터를 html로 불러온다.
그리고 이를 lego_movie 페이지에 저장한 다음, 이를 인수로 받아 (%>%) 정보를 뽑아낸다.
html_node()와 html_nodes()는 노드를 뽑는다. 기본은 CSS Style이지만 xpath= 옵션으로 xpath 문법도 쓸 수 있다.
일단 html_text()로 데이터를 텍스트화하면 as.numeric()을 써서 손쉽게 숫자데이터로 바꿀 수 있다. 문제는 데이터 안에 콤마나 다른 문자가 포함될 수 있다는 점!

url="https://www.kickstarter.com/projects/1350078939/moonshot-the-indigenous-comics-collection?ref=home_popular"
page <- html(url)

marker_backers = "id('backers_count')/data"
marker_goal = "id('pledged')/data"
a <- html_node(page,xpath=marker_backers)
b <- html_text(a)
sub(",",'",b)

이렇게 해서 콤마를 없앤다.
sub() 함수는 패턴,바꿀값,원래값을 인자로 가진다.

rvest 패키지의 가장 좋은 점은 session 컨트롤이 된다는 것과, 웬만하면 dynamic html을 rendering해서 보여준다. Javascript로 동적 생성된 웹페이지도 rvest로 보면 데이터가 보이는 것을 확인할 수 있다.

R의 paste()와 {plyr} 패키지, 그리고 {tm}과 {rvest}를 결합하면 상당히 손쉽게 웹데이터를 가져와서 연구에 활용할 수 있다.


댓글

이 블로그의 인기 게시물

Bradley-Terry Model: paired comparison models

xlwings tutorial - 데이터 계산하여 붙여 넣기

R에서 csv 파일 읽는 법