brunch

You can make anything
by writing

C.S.Lewis

by normal B Mar 01. 2023

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

CX(Customer Experience) Specialist를 향해서

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)를 만들어 시각화할 수도 있다.


매거진의 이전글 데이터분석 준전문가(ADsP) 합격 수기
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari