본문 바로가기

R 크롤링

네이버 영화 리뷰 크롤링 in R

반응형

## 작성일: 2019.07.22

## 작성자: 춤추는초코칩

## URL변수가 동일한 페이지를 노출시키는 문제 해결

 

## 작성일: 2017.12.09

## 작성자: 춤추는초코칩

## 참고문허: R과Java로 크롤링하자

## Part03 R을 활용하여 크롤링하기

개요

 안녕하십니까? 춤추는초코칩입니다. 2017년 블로그한 "[R크롤링] 2. R을 이용한 네이버(Naver) 영화 네티즌 리뷰 크롤링"에 많은 분들이 관심을 가져 주셨습니다. 근데, 2019년 5월 김연창님께서 댓글로 코딩의 문제점을 확인해주셨습니다.

 처음에는 제 코드에 문제가 아니라 복사하다가 잘 못하셨나 생각했습니다. 그래서 메일로 작성하신 코드를 받아서 테스트를 했습니다. 문제는 일단 제 코드였습니다. 당시 사용했던 코드에서 URL변수는 크롤링할 사이트 주소를 저장하는 변수입니다. 근데 이 변수가 모두 동일한 사이트로 조회가 되었습니다. 예를 들어 아래 두 사이트를 링크로 조회해 보시면,

 

https://movie.naver.com/movie/point/af/list.nhn?st=mcode&sword=159037&target=after&page=1encoding="euc-kr"

https://movie.naver.com/movie/point/af/list.nhn?st=mcode&sword=159037&target=after&page=2encoding="euc-kr"

 

그래서, 김연창님이 말씀하신 것과 같이 첫 페이지 리뷰만 20번 반복해서 저장되었습니다. 감사합니다.

 

코드

# NAVER 영화('메리와 마녀의 꽃') 리뷰 20쪽까지 크롤링

# 작업폴더 지정

setwd("C:/Rcrawl")
getwd()

 

# 패키지 인스톨 및 불러오기
#install.packages("R6")
#install.packages("rvest")
library("R6")
library("rvest")

 

# 리뷰를 저장한 공간 만들기

all.reviews <- c()

 

# 20페이지까지 크롤링하기 위해 20번 반복합니다. 10페이지까지 크롤링하시려면 20을 10으로 바꾸시면 됩니다.
for(page in 1:20){

  # 크롤링할 사이트 주소 만들기

  url <- paste('http://movie.naver.com/movie/point/af/list.nhn?st=mcode&sword=159037&target=after&page=', page, sep='')

  # read_html 함수를 사용하여 html 페이지를 htxt 변수에 저장
  htxt <- read_html(url,encoding="CP949")

  # html_nodes 함수를 사용하여 list_netizen class를 table 변수에 저장
  table <- html_nodes(htxt,'.list_netizen')

  # html_nodes 함수를 사용하여 title class를 content 변수에 저장
  content <- html_nodes(table, '.title')

  # html_text 함수를 사용하여 text를 reviews 변수에 저장
  reviews <- html_text(content)

  # 리뷰가 없으면 더이상 반복문을 실행하지 않습니다.
  if(length(reviews)==0){break}

  # 리뷰 병합
  all.reviews <- c(all.reviews, reviews)

  # 크롤링한 페이지를 출력
  print(page)
}

 

# 저장된 리뷰를 write.table 함수를 사용하여 txt파일로 저장
write.table(all.reviews, 'naver.txt')

 

설명

 수정한 부분은 2부분입니다.

 첫번째 URL부분에서 encoding을 제거 했습니다.

 두번째 encoding 방식을 기존 "euc-kr"에서 "CP949"로 수정했습니다. 기존 "euc-kr" 인코딩 방식은 일부 페이지에서 에러가 발생했습니다. 

  Error in doc_parse_raw(x, encoding = encoding, base_url = base_url, as_html = as_html,  :

  input conversion failed due to input error, bytes 0x94 0x66 0xB4 0xC2 [6003]

 영어가 짧다보니 검색해도 무슨 말인지 알 수가 없었습니다. 그래도 인코딩에 문제가 있구나를 알게되었는데, 해결방법은 없었습니다. 검색을 계속하던 중에 "한글 인코딩 종류 및 문제점 파악하기 (UTF-8 vs. EUC-KR)"에서 다음 그림을 발견했습니다. 뭐 맞는 해석인지는 모르겠습니다만 수정 후에 정상적으로 실행되는 듯 합니다.

출처: https://studyforus.tistory.com/167

결과

 코드 실행 결과, 1번과 21번의 글이 달라진 것을 확인했으며, 이는 홈페이지와도 동일했습니다.

 댓글로 글을 남기시지 않으셨다면 잘 못된 줄 몰랐을 겁니다. 저도 책에 예제를 따라하기는 하지만 혹시, 홈페이지에서 코딩 자료를 복사해서 사용하시다가 안되는 글이 있으면 댓글로 알려 주세요. 잘 못 된 자료는 업데이트 하겠습니다. 그리고 인코딩 여전히 어렵네요.

 

기존 글 보러가기: "[R크롤링] 2. R을 이용한 네이버(Naver) 영화 네티즌 리뷰 크롤링"

참고 사이트: "한글 인코딩 종류 및 문제점 파악하기 (UTF-8 vs. EUC-KR)"

반응형