## 작성일: 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=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)"에서 다음 그림을 발견했습니다. 뭐 맞는 해석인지는 모르겠습니다만 수정 후에 정상적으로 실행되는 듯 합니다.
결과
코드 실행 결과, 1번과 21번의 글이 달라진 것을 확인했으며, 이는 홈페이지와도 동일했습니다.
댓글로 글을 남기시지 않으셨다면 잘 못된 줄 몰랐을 겁니다. 저도 책에 예제를 따라하기는 하지만 혹시, 홈페이지에서 코딩 자료를 복사해서 사용하시다가 안되는 글이 있으면 댓글로 알려 주세요. 잘 못 된 자료는 업데이트 하겠습니다. 그리고 인코딩 여전히 어렵네요.
기존 글 보러가기: "[R크롤링] 2. R을 이용한 네이버(Naver) 영화 네티즌 리뷰 크롤링"
'R 크롤링' 카테고리의 다른 글
네이버 금융 크롤링 in R (0) | 2022.02.23 |
---|---|
오픈API를 활용한 대기오염정보 조회(5) (0) | 2019.06.13 |
[R] 디아블로3 API(6): 직업별 상위 100위 아이템 히스토그램 (0) | 2018.03.24 |
[R] 디아블로3 API를 활용하여 직업별 상위 랭킹 세팅 분포 구하기 다섯번째날 (0) | 2018.03.23 |
[R] 디아블로3 API를 활용하여 직업별 상위 랭킹 세팅 분포 구하기 네번째날 (0) | 2018.03.19 |