brunch

원하는 페이지에서 데이터 수집하기(RStudio)

CX(Customer Experience) Specialist를 향해서

by normal B

CXM을 위해서는 VOC 데이터 수집이 중요하다. 고객 경험 개선을 위한 데이터 분석에서 말한 것처럼 고객 문의 '내용'을 분석하는 것만으로도 많은 것을 알 수 있다. 다만, 방대한 양의 고객 문의 내용을 분석하는 것이 쉽지 않을 뿐이다. 그래서 복잡한 VOC 데이터 분석 전에 웹사이트 상에서 짧은 텍스트 정보를 해석하는 작업을 해보는 것이 도움이 될 수 있다. 리디에서 2020년에 '올해 읽은 최고의 책'을 댓글로 남기면 포인트를 주는 이벤트를 했었는데 사람들이 어떤 책을 많이 썼는지 궁금하기도 하고, 분석하기 적합해 보여 가지고 왔다.


데이터를

수집하기 전


원하는 페이지에서 데이터를 수집하기 위해서는 해당 페이지가 데이터 수집이 가능한 페이지인지 확인이 필요하다. 사이트 주소 뒤에 robots.txt를 입력(e.g. http://www.example.com/robots.txt)해서 Disallow을 확인한 후 데이터 수집을 시작한다.

- 사이트 : 리디
- 이벤트 : 댓글 달고 포인트 받자!
- 이벤트 기간 : 2020.08.25 ~ 08.26

이벤트의 모든 댓글을 수집/분석해야 하므로 url의 구성을 파악할 필요가 있다.

- 이벤트의 댓글은 리스트 페이징으로 되어있다.
- 첫 번째 페이지의 url은 'https://ridibooks.com/event/24012?page=1' 이다.
- 페이지를 이동할 때마다 '숫자#comments'가 붙는다. (e.g. https://ridibooks.com/event/24012?page=2#comments)
- 기본 url 구성은 'https://ridibooks.com/event/24012?page=' 이다.


데이터

수집하기


이제 RStudio에서 2020년도에 리디 사용자들이 뽑은 '올해 읽은 최고의 책'을 확인해 보자.


> install.packages("rvest") #html 문서를 가져와서 처리할 수 있는 패키지를 설치
> library(rvest) #설치된 패키지 불러오기

> base_url <- 'https://ridibooks.com/event/24012?page=' #base_url에 기본 url 구성 저장하기


이제 명령어를 모든 페이지에 적용하도록 반복문 코드를 작성해야 하는데, 2페이지부터는 'page=' 뒤에 숫자+#comment 형식이기 때문에 1페이지와 2페이지 이후의 결괏값을 각각 구해서 합치도록 하겠다.


> all.comments <- c() #데이터 저장할 공간 만들기

> for (page in 2:1000) { #page가 1000일 때까지 반복해서 수행
url <- paste0(base_url, page, "#comments") #url에 base_url, page(2:1000), #comment 저장
txt <- read_html(url) #html 페이지(저장한 url)를 읽어와 txt에 저장
wrapper <- html_nodes(txt, ".comments_wrapper") #이벤트 댓글이 포함되어 있는 클래스를 추출함
comment_text <- html_nodes(wrapper, ".comment_text") #상위 클래스(wrapper) 안에 포함되어 있는 댓글(comment_text)을 추출함
comments <- html_text(comment_text) #text만 추출
if(length(comments) == 0) {break} #comments가 0일 때 반복을 멈춤
all.comments <- c(all.comments, comments) #comments를 all.comments에 저장
print(page) #페이지 출력
}

all.comments에 2페이지부터 댓글이 모두 저장된 것을 확인할 수 있다. 이제 아래처럼 1페이지의 댓글도 가져와서 합쳐주기만 하면 된다.


> page1 <- read_html('https://ridibooks.com/event/24012?page=1')
> wrapper2 <- html_nodes(page1, ".comments_wrapper")
> comments2 <- html_nodes(wrapper2, ".comment_text")
> comments2 = html_text(comments2)
> all.comments <- c(all.comments, comments2)



총 7,076개의 댓글이 나왔다. 댓글의 공백 및 특수문자를 제거해서 깔끔하게 만들어 2020년도 '올해 읽은 최고의 책' 1위를 확인해 보자.


데이터

전처리하기


데이터를 분석하고 시각화하기 위해서는 데이터를 깔끔하게 정리해 주는 전처리 과정이 필수이다. 나는 한글/영문/숫자만 남기고 제거했다.


> install.packages("stringr") #텍스트 처리 패키지 설치
> library(stringr) #설치된 패키지 불러오기

> all.comments <- str_remove_all(all.comments, "[^\\w]") #문자를 제외하고 제거


간단하게 데이터 전처리를 해준 후 빈도표를 만들어야 하는데, 현재 all.comments의 형태는 문자 벡터이기 때문에 빈도표를 만들기 위해서는 서로 다른 데이터 타입(문자/숫자)을 가질 수 있는 데이터 프레임(table) 형태로 바꿔줘야 한다.


> table <- data.frame(table(all.comments)) #table에 all.comments와 빈도(freq) 저장


이렇게 all.comments와 Freq로 2개의 열이 생겼다. 마지막으로 dplyr 패키지의 arrange 함수를 써서 빈도(Freq)가 높은 순으로 정렬을 해주고 '올해 읽은 최고의 책' Top10을 확인해 보자.


> install.packages("dplyr")
> library(dplyr)

> table <- arrange(table, desc(Freq)) #빈도가 높은 순으로 정렬

> top10 <- head(table, 10)  #top10 추출


아래와 같이 결과를 확인할 수 있다. 이렇게 추출한 데이터로 워드클라우드(wordcloud)를 만들어 시각화할 수도 있다.


keyword
매거진의 이전글데이터분석 준전문가(ADsP) 합격 수기