본문 바로가기

R

R을 활용한 무신사 리뷰 데이터 크롤링

코로나 이전엔 옷은 무조건 입어보고, 직접보고 사야된다는 고정관념이 심했다.

항상 백화점이나 쇼핑몰에 가서 옷을 입어보고 구매하였고 코트나 패딩과 같이 가격대가 비교적 높은 옷들을 입어보지 않고 구매를 하는건 생각지도 못했었다. 

 

하지만 코로나 이후 소비의 변화가 많이 발생하였다.

이제는 인터넷으로 쇼핑을 하는 것이 익숙해졌으며 코트나 패딩과 같은 높은 가격대의 옷들 또한 리뷰와 제품 상세 정보들을 확인하며 구매를 하기도 한다. 트렌드가 바뀌니 점점 쇼핑몰에서도 더더욱 신경을 쓰기 시작하였고 재질이나 핏, 사이즈 등을 상세하게 표시하고 있다.

 

하지만 아직까지 한계가 있는 부분은 색감 표현이 아닐까 생각한다. 무신사를 비롯해서 인터넷 쇼핑몰에서 옷을 구매할 때 사이즈, 재질 등은 예상이 가능한 부분이었지만 가장 예상과 달랐던 부분은 색감이었다. 사람들이 사용하는 모니터, 제품을 찍는 카메라 해상도마다 색감의 표현이 다 다를 수 밖에 없다. 따라서 인터넷쇼핑몰의 한계점을 꼬집어보고자 색감이 없는 옷(흰색, 검은색)과 색감이 있는 옷(주황색, 갈색, 초록색)들의 리뷰 데이터를 통해서 고객들의 만족도가 어떠한지, 차이가 있는지 살펴보고자 하였다.

 

이를 위해서 우선 각 제품별로 리뷰 데이터를 크롤링해와야 한다.

무신사 리뷰 크롤링은 꽤 까다로운 구조로 되어있었다. 네이버 영화 리뷰를 크롤링할 시 리뷰 페이지를 넘길때마다 URL에서 특정 부분이 규칙적으로 변화하기 때문에 반복문을 사용해서 한 블럭의 코드를 통해 많은 데이터를 가져올 수 있다.

 

하지만 무신사의 경우 리뷰 페이지를 넘김에도 URL의 변화는 없었다. 따라서 반복문을 활용한 크롤링은 불가능하였고 직접 html 태그를 찾아 데이터를 긁어오고 요소를 클릭하며 리뷰 페이지를 넘기는 방법밖엔 존재하지 않았다. 이를 위해 selenium패키지와 keyboardsimulator패키지를 활용하여 진행하였다.

 

#install.packages("RSelenium")
#install.packages("KeyboardSimulator")

library(RSelenium)
library(KeyboardSimulator)

패키지를 다운받아 주고 library()로 불러와준다.

 

remDr <- remoteDriver(remoteServerAddr = 'localhost',
                      port = , # 포트번호 입력
                      browserName = "chrome")
remDr$open()

포트번호를 입력한 후 실행 시 chrome창이 열린다.

 

url='https://store.musinsa.com/app/goods/501694/0'
remDr$navigate(url) #칼하트 페이지
Sys.sleep(5)

접속하고자 하는 url을 입력한 후 chrome창이 열려있는 remDr변수를 navigate()를 통해 해당 url로 이동시켜 준다.

 

butnn <- remDr$findElement(using="css",value='.prd-score__review-count')
remDr$mouseMoveToLocation(webElement = butnn)
remDr$click(buttonId = 'LEFT') #후기 보기

#일반후기 선택
butnn <- remDr$findElement(using='xpath','//*[@id="estimate_goods"]')
remDr$mouseMoveToLocation(webElement = butnn)
remDr$click(buttonId = 'LEFT')

butnn 변수에 html 태그 값들을 넣어줌으로써 클릭하고자 하는 요소를 찾아 움직여준 후 클릭한다.

 

#상품 종류 메뉴 선택
butnn <- remDr$findElement(using='xpath','//*[@id="wrapEstimateList"]/p[2]/select[2]')
remDr$mouseMoveToLocation(webElement = butnn)
remDr$click(buttonId = 'LEFT')

# 해당 상품에 마우스 움직임 후 클릭
mouse.move(330,680) 
Sys.sleep(0.5)
mouse.click()
Sys.sleep(2)

 

상품 종류 메뉴 클릭시 다음과 같은 화면이 출력되는데 이 메뉴에 대한 html 태그 값은 존재하지 않는다.

따라서 keyboardsimulator패키지에 내장된 mouse함수를 활용하여 마우스를 움직여주고 클릭해주었다. 각 모니터마다 좌표가 다르기 때문에 사용 시 좌표 조절이 필요하다.

#만족도 정보 가져오고 df화
text1 <- remDr$findElements(using = 'css selector','div.prd-level-each')
review1 <- sapply(text1, function(x) {x$getElementText()})
review1 <- unlist(review1)
df1 <- data.frame(review1)
df1 <- df1[-c(1:20),] #공백 제거
df1 <- data.frame(df1)

리뷰에서 만족도 정보에 해당하는 html 태그 값들을 찾아주고 데이터를 불러와 DataFrame으로 만들어주었다.

 

#2번째 페이지
butn2 <- remDr$findElement(using = "xpath",value ='//*[@id="wrapEstimateList"]/div/div[11]/div[2]/div/a[4]')
remDr$mouseMoveToLocation(webElement = butn2)
remDr$click(buttonId = 'LEFT')  
Sys.sleep(2)

이와 같은 페이지 번호들을 클릭해주어야 한다. 따라서 해당 페이지 번호의 html 태그를 활용하여 클릭한 후 페이지를 넘겼다.

이와 같은 작업을 반복함으로써 리뷰 데이터를 모두 크롤링함으로써

다음과 같은 형식으로 저장된다.

 

다음 편에선 아래 사진과 같이 데이터를 각 항목들 별로 열을 생성해주고 통계 기법을 활용하기 위해 범주변수로 변환시키는 전처리 과정에 대해 이야기 하겠다.

satisfy는 총 만족도(별점)이다.