반응형

R로 웹 크롤링을 할 수 있게 함수를 제공해주는 라이브러리를 이용하여 네이버를 웹 크롤링하겠습니다.

 

저는 네이버 영화 랭킹에 있는 영화를 대상으로 리뷰를 모두 긁어와 데이터 분석에 활용할 생각입니다.

그러기 위해서는 영화 목록을 먼저 가져와야겠죠!

 

이번 화에서는 네이버 영화 랭킹 페이지에 있는 영화의 목록 2000개를 가져오겠습니다.

다음 화는 [R 네이버 영화 웹 크롤링하기 #2 - 영화 리뷰 키워드 수집] 입니다^^

 

가공되지 않은 영화에 대한 리뷰 정보만 필요하신 분들은 아래로 바로 넘어가주세요~

[R 네이버 영화 웹 크롤링하기 #3 - [번외] 영화 리뷰 수집]

 

대상이 되는 웹사이트(네이버 영화)를 선택한 후, 크롬-개발자도구를 이용하여 소스를 봅시다.


 

http://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20170622

 

사진에 글을 썼는데 잘 안보이네요! 확대 하시면 자세히 볼 수 있습니다ㅎㅎ

 

1. 크롬에서 개발자도구를 여신 후에, 개발자도구 좌측 상단에 보면 '네모 안에 있는 화살표' 아이콘이 보입니다.

선택한 대상에 해당하는 소스코드를 확인할 수 있게 해줘서 내가 찾고자하는 텍스트나 대상이 어떻게 코딩되었는지 볼 수 있습니다.

 

2. '네모 안에 있는 화살표'를 클릭하신 후 확인하고자 하는 텍스트나 대상을 선택합니다.

 

3. 우측 Elements란에 해당 텍스트나 대상이 어떻게 코딩되었는지 볼 수 있습니다.

네이버 영화 랭킹의 '영화제목'의 경우 class가 "tit5"인 div 태그로 묶여있음을 볼 수 있습니다.

영화제목에 해당하는 데이터만 불러오고 싶을때 이렇게 반복되는 패턴을 기준으로 데이터를 추출할 수 있습니다.

 

(페이지 내에서 반복되는 패턴을 찾는 것이 중요합니다. 내가 원하는 데이터가 어떤 형식으로 구성되어있는지, 어떻게 반복되는지 알아야겠죠!

네이버 같은 경우만 보아도 '영화' 관련된 페이지여도 개발자가 다르기 때문에 개발하는 스타일도 다릅니다!

겉보이게는 비슷한 구조로 보이지만 속은 완전 다르게 구성되어 있는 경우도 있을거에요.

크롤링하고자 하는 데이터가 네이버 뿐만 아니라 다음, 구글에서도 수집해야할 때가 많겠죠!

그러니 패턴을 찾는 작업이 중요합니다)

 

* 위에서 확인된 정보로 R에서 네이버 소스코드를 읽어와 class="tit5"인 div를 찾아, 영화 목록을 만들어보겠습니다.

 


 

1
2
3
4
5
6
7
8
9
10
#+--------------------------------------------------------------------------------------------+#
# 제 목 : 네이버 영화 랭킹 페이지에서 영화 코드, 영화 제목, 평점을 2000개 가져온다.
# 작성자 : 2015013390
# 작성일 : 2017-06-10
# 출력값 : 영화코드값, 영화명, 영화평점이 들어있는 파일을 생성
# 파일위치 : C:\Temp
#+--------------------------------------------------------------------------------------------+#
 
library(XML)
library(stringr)
cs

 

line 8 & 9 : 웹 크롤링과 String을 자르는 데에 필요한 라이브러리를 호출한다.

만약 해당 라이브러리가 설치되어있지 않다면 install.packages("라이브러리명")을 입력하여 설치하기 바란다.

 

 

 


 

1
2
3
4
5
6
#크롤링 시작#
url_base <- "http://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20170606&page=" #네이버 영화 랭킹 목록
 
all.codes <- c() #영화 코드 목록
all.titles <- c() #영화 이름 목록
all.points <- c() #영화 평점 목록
cs

 

line 2 : 크롤링할 url에서 페이징 처리가 될 부분 즉, 변수처리할 부분을 제외하고 입력한다.

단일 페이지의 경우 상관이 없으나 아래와 같이 첫번째 페이지부터 마지막 페이지까지 반복하여 데이터를 가져오는 경우라면

반복문을 이용하여 순차적으로 페이징 처리를 해줄것이다.

http://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20170622&page=1

http://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20170622&page=2

 

 

 


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1-40페이지 영화 목록 수집
for(page in 1:40)
{
    url <- paste(url_base, page, sep='')
    txt <- readLines(url, encoding="euc-kr")
 
    movie_info <- txt[which(str_detect(txt, "class=\"tit5\""))+1] #tit5클래스 아래 1줄 아래에는 영화 고유코드와 제목이 있다.
    points <- txt[which(str_detect(txt, "class=\"tit5\""))+7] #tit5클래스 아래 7줄 아래에는 평점이 있다.
    
     #titles #print
    #points #print
    
    codes <- substr(movie_info, 4050) #일부 코드를 선택
    codes <- gsub("\\D","",codes) #코드 중 숫자만 남기고 지우기
    titles <- gsub("<.+?>|\t""", movie_info) # 텍스트만 남기고 코드 지우기 (이렇게하면 소스코드인식을 안하는듯)
    points <- gsub("<.+?>|\t""", points) # 텍스트만 남기고 코드 지우기
    
    all.codes <-  c(all.codes, codes) #영화 코드값 저장
    all.titles <- c(all.titles, titles) #영화 이름 저장
    all.points <- c(all.points, points) #영화 평점 저장
}
cs

 

line 2 : 네이버 영화 랭킹 페이지의 경우 1 부터 40 까지의 페이지가 있다.

한 페이지당 50개 씩, 총 2000개의 영화 제목, 영화 코드, 영화 평점 정보를 가져올 수 있다.

 

line 4 : url_base 변수에 담겨있던 url에 for을 통해 1, 2, ... , 40 까지 문자열을 붙인다.

"http://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20170606&page=" 여기에 1, 2, 3 ... 40 이 번걸아가며 붙는 것이다.

아래와 같은 형태로..

"http://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20170606&page=1 "

"http://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20170606&page=2"

 

 

line 5 : URL에 해당하는 웹을 읽고, encoding 형식은 "euc-kr"로 한다. 읽어온 정보는 txt라는 변수에 넣는다.

제일 처음으로 실행되는 URL의 주소는 "http://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20170606&page=1" 이다.

 

line  7 & 8 : 읽어온 정보가 들어있는 txt 변수에서 class="tit5" 라는 문자열이 존재하는 곳을 찾아서

한 줄 아래에 있는 정보는 moive_info 변수에 넣고, 일곱 줄 아래에 있는 정보는 points 변수에 넣는다.

 

line 13 : movie_info 에 넣은 내용 중 40번째 문자부터 50개의 문자만 가져와서 codes 변수에 담는다.

line 14 : codes 에는 숫자 형식의 영화 코드값과 일부 소스값이 함께 담겨있는데, 이 중에서 숫자를 제외한 데이터는 삭제한다.

line 15 : movie_info 에서 텍스트만 가져오면, 텍스트형식으로 되어있는 영화 제목만 남고 소스코드는 사라진다. 이 데이터를 title 변수에 넣는다.

line 16 : points 변수에서 텍스트로 이루어져있는 평점 (9.34) 만 남긴다.

 

line 18 & 19 & 20 : 소스코드에서 필요한 데이터만 추출한 결과를 각 리스트에 담는다.

 

 

 


 

1
2
3
4
5
6
7
#txt 파일로 출력
<- cbind(all.codes, all.titles, all.points)
colnames(x) <- c("code""movie_title""point")
 
#x <- data.frame(code=c(all.codes), movie_title=c(all.titles),point=c(all.points))
 
write.table(x, "C:\\Temp\\movie_list.txt")
cs

 

line 2 : For문에서 1~40 페이지까지 반복하여 얻은 영화 제목, 영화 코드, 영화 평점 정보를 하나의 벡터로 만든다.

line 3 : 벡터(여기서는 배열로 생각해도 된다)의 열(컬럼) 별칭을 지정해준다.

line 7 : 해당 영화 정보를 C:\Temp 폴더에 "movie_list.txt"라는 텍스트파일로 생성한다.

 

 

[텍스트파일 결과값]

 


 

여기까지가 R을 이용한 네이버 영화 웹 크롤링 1단계 끝!!

다음에는 이 텍스트 파일을 이용해서 텍스트 내에 있는 영화를 대상으로 각 영화에 등록된 리뷰를 불러오겠습니다.

궁금한 게 있으시다면 댓글로 남겨주세요~

반응형