본문 바로가기
코딩 연습/코딩배우기

파이썬 크롤링(Crawling) 연습 - 네이버 영화 평점/리뷰, 영화코드 추출

by good4me 2020. 11. 4.

goodthings4me.tistory.com

 

■ 네이버 영화 사이트에 있는 평점/리뷰의 제목과 평점을 추출하여 dict로 저장하고, 영화코드를 파일로 저장해보기

import urllib.request
from bs4 import BeautifulSoup
from itertools import count

def get_movie_reviews(mcode):
    url = 'https://movie.naver.com/movie/point/af/list.nhn?st=mcode&sword=' + str(mcode) + '&target=after&page=1'
    idx = 0
    for cnt in count(1): #range(0, 1000):
    ## paging으로 변경(1,2,3,...)되는 url은 for문 try 부분에서 처리하여 대입시켜줌        
        review_html = urllib.request.urlopen(url).read()
        review_soup = BeautifulSoup(review_html, 'html.parser')
        review_list = review_soup.find_all('td', class_ = 'title')
        
        for review in review_list:
            title = review.find('a', class_ = 'movie color_b').get_text()
            score = review.find('em').get_text()
            review_text = review.find('a', {'class':'report'}).get('href').split(',')[2]  ## 신고
            
            ## 소스 코드의 <a href="javascript:report 부분에서 href를 split() 한 후 index를 사용하여 추출함
#            for c in review.find('a', {'class':'report'}).get('href').split(','):
#                print(c)
#                '''
#                0 : javascript:report('0105****', 
#                1 : 'teoqD27auI8H7asrwMr2L+kykhqCElI2BN/bFbecr1A=', 
#                2 : '완전 내 취향 저격 영화. 내가 좋아하는 모든 게 들어가있음.', 
#                3 : '17230085', 
#                4 : 'point_after');
#                '''

            idx += 1
            print('{}.{} (평점: {})'.format(idx, title, score))
            print(review_text)
            
        ## paging 처리 부분 - pg_next
        ## old_content > div.paging > div > a.pg_next 확인
        ## href인 /movie/point/af/list.nhn?st=mcode&sword=185917&target=after&page=4' 추출
        ## 마지막 페이지에 next 버튼 없어서 에러날 수 있는 부분은 예외처리 함
        try:
            url = 'https://movie.naver.com' + review_soup.find('a', {'class':'pg_next'}).get('href')
            #print(url)
        except:
            break;
            
        if cnt == 1:  ## 1페이지
            break
            
    return None
            
get_movie_reviews(185917)  ## 반도 영화 코드



[실행 결과]

1.반도 (평점: 1)
 '이거 볼바에는 꼬마버스타요 본다'
2.반도 (평점: 2)
 '유치찬란한 대사ㅋㅋ내 손발 어쩔 ㅋ CG도 10년 전보다 못함ㅋㅋㅋ'
3.반도 (평점: 4)
 '아니 스토리고 연출 형편없는것보다 조연들 연기가 정말 정말 어색하기 짝이 없다.'
4.반도 (평점: 1)
 '재미없음 그냥만은 한데 무서운거 조금도 못보는 사람한테는 비추 좀 보는 사람은 한번쯤은 볼만 한데 내 돈 주고 보진않을듯ㅇㅇ그리고 부산행 절대 못따라감'
5.반도 (평점: 1)
 '와 심각...진짜 심각하다...'
6.반도 (평점: 1)
 '신파시파신파신파덩어리. 부산행이랑 연관짓지마라 진짜.'
7.반도 (평점: 2)
 '부산행 감독이라구요? 깜놀?!너무 뻔한스토리에 기대 이하 연출까지...감동 억지로 짜내고 엄청 어설프고..기대 많이 했는데 아쉽네요ㅡㅡ'
8.반도 (평점: 1)
 '자질은 없는데[ 부모를 잘맛낫거나  집에돈이많거나
9.반도 (평점: 6)
 '이영화 재밌겠봤으면 랜드오브데드 추천함'
10.반도 (평점: 6)
 '다양한 시도는 앞으로 한국 영화산업 발전에 기여할거라고 믿고 별3개는 드립니다'
 

 

good4me.co.kr

 

▷ 현재 상영작 영화 코드를 추출하고, 위 함수를 호출하여 평점/리뷰를 추출

def get_current_movie_code():
    url = 'https://movie.naver.com/movie/point/af/list.nhn'

    naver_movie = urllib.request.urlopen(url).read()
    soup = BeautifulSoup(naver_movie, 'html.parser')
    select_tag = soup.find('select', id = 'current_movie')
    movies = select_tag.find_all('option')
    
    movies_dict = {}  ## 영화 코드와 제목 담을 dict
    cnt = 0
    for movie in movies[1:]:  ## index 0번 (현재 상영작)은 제외
        movies_dict[movie.get('value')] = movie.get_text()
        
        get_movie_reviews(movie.get('value'))  ## 함수 호출
        
        cnt += 1
        if cnt == 1:  ## 영화 코드 1개로 제한
            break
        
    return movies_dict

## 함수의 반환 값(영화 코드)을 확인하기
for k, v in get_current_movie_code().items():
    print(v, k)




[실행 결과]

1.도굴 (평점: 4)
 '내가 뭘본거지;; 평점낚시 ㅅㅂ'
2.도굴 (평점: 10)
 '개존잼 와 기대안햇는데'
3.도굴 (평점: 10)
 '재밌었어요 넘넘 좋았어요'
4.도굴 (평점: 10)
 '코로나 이후 처음으로 본 영화인데 연기력 좋은 배우들이라 그런지 보는내내 너무 재밋게잘봤던 것 같다!가볍게 가족끼리 친구끼리 볼 수 있는 영화니까 다들 보러가세요 ㅎㅎ'
5.도굴 (평점: 10)
 '“초코파이 좋아하세요 ?”'
6.도굴 (평점: 10)
 '간만에 극장에서 많이 웃었어요 진짜 강추합니다!!'
7.도굴 (평점: 10)
 '오늘 시험 끝나서 봤는데 진짜 재미있었어요!'
8.도굴 (평점: 4)
 '이게 왜 재밌다는건지 요즘 진짜 영화볼게없다 ㅠ'
9.도굴 (평점: 10)
 '배우분들 다 제가 좋아하는 분들이고 연기도 잘하셔서 즐겁게 봤어요!'
10.도굴 (평점: 2)
 '아..내돈 만원 ㅜㅜ 로또나 그냥 살껄..영화보고 더 우울해졌다..'
도굴 193194

 

 

▷ 네이버 영화 코드 가져오기 (2,000개), 파일로 저장하기

def get_movie_code(day):
    url = 'https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=' + day + '&page=1'
    movies_dict = {}
    idx = 0
    for cnt in count(1):
        pnt = urllib.request.urlopen(url).read()
        soup = BeautifulSoup(pnt, 'html.parser')
        for tag in soup.find_all('div', {'class':'tit5'}):
            title = tag.a.text  ## get('title')
            code = tag.a.get('href').split('?')[1].replace('code=','')  ## 코드만 추출
            movies_dict[title] = code
            
            movie_code = title.strip() + ':' + code.strip() + '$'
            
            with open('naver_movie_code.txt', 'a', -1, 'utf-8') as f:  ## 파일로 저
                f.write(movie_code)
                
            idx += 1
            print(idx, title, code)
        print(cnt)
        
        ## paging 처리 부분 - 다음 클릭 시 페이지 이동 href를 가져와서 url을 for문에서 다시 사옹       
        #sub_url = soup.find('td', {'class':'next'}).a['href']
        
        try:
            url = 'https://movie.naver.com' + soup.find('td', {'class':'next'}).a['href']  ## 다음 버튼(paging)
            print(url)
        except:
            break
        

        if cnt == 1:  ## 1페이지로 제한
            break
            
    print(movies_dict, len(movies_dict))


get_movie_code('20201102')




[실행 결과]

1 그린 북 171539
2 가버나움 174830
3 디지몬 어드벤처 라스트 에볼루션 : 인연 192613
4 먼 훗날 우리 175092
5 부활: 그 증거 194334
6 베일리 어게인 144906
7 아일라 169240
8 원더 151196
9 포드 V 페라리 181710
10 당갈 157243
11 주전장 179518
12 쇼생크 탈출 17421
13 터미네이터 2:오리지널 10200
14 덕구 154667
15 보헤미안 랩소디 156464
16 라이언 일병 구하기 18988
17 월-E 69105
18 나 홀로 집에 10016
19 클래식 35939
20 헬프 82432
21 그대, 고맙소 : 김호중 생애 첫 팬미팅 무비 196828
22 사운드 오브 뮤직 10102
23 매트릭스 24452
24 인생은 아름다워 22126
25 살인의 추억 35901
26 소년시절의 너 192066
27 포레스트 검프 17159
28 빽 투 더 퓨쳐 10002
29 위대한 쇼맨 106360
30 글래디에이터 29217
31 센과 치히로의 행방불명 32686
32 타이타닉 18847
33 토이 스토리 3 66463
34 어벤져스: 엔드게임 136900
35 알라딘 163788
36 헌터 킬러 92125
37 아이즈 온 미 : 더 무비 189027
38 캐스트 어웨이 31162
39 죽은 시인의 사회 10048
40 레옹 17170
41 동주 134899
42 반지의 제왕: 왕의 귀환 31796
43 히든 피겨스 147092
44 아이 캔 스피크 161850
45 집으로... 34324
46 브레이크 더 사일런스: 더 무비 195975
47 안녕 베일리 181700
48 쉰들러 리스트 14450
49 서유기 2 - 선리기연 18543
50 클레멘타인 37886
1
https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20201102&page=2
{'그린 북': '171539', '가버나움': '174830', '디지몬 어드벤처 라스트 에볼루션 : 인연': '192613', '먼 훗날 우리': '175092', '부활: 그 증거': '194334', '베일리 어게인': '144906', '아일라': '169240', '원더': '151196', '포드 V 페라리': '181710', '당갈': '157243', '주전장': '179518', '쇼생크 탈출': '17421', '터미네이터 2:오리지널': '10200', '덕구': '154667', '보헤미안 랩소디': '156464', '라이언 일병 구하기': '18988', '월-E': '69105', '나 홀로 집에': '10016', '클래식': '35939', '헬프': '82432', '그대, 고맙소 : 김호중 생애 첫 팬미팅 무비': '196828', '사운드 오브 뮤직': '10102', '매트릭스': '24452', '인생은 아름다워': '22126', '살인의 추억': '35901', '소년시절의 너': '192066', '포레스트 검프': '17159', '빽 투 더 퓨쳐': '10002', '위대한 쇼맨': '106360', '글래디에이터': '29217', '센과 치히로의 행방불명': '32686', '타이타닉': '18847', '토이 스토리 3': '66463', '어벤져스: 엔드게임': '136900', '알라딘': '163788', '헌터 킬러': '92125', '아이즈 온 미 : 더 무비': '189027', '캐스트 어웨이': '31162', '죽은 시인의 사회': '10048', '레옹': '17170', '동주': '134899', '반지의 제왕: 왕의 귀환': '31796', '히든 피겨스': '147092', '아이 캔 스피크': '161850', '집으로...': '34324', '브레이크 더 사일런스: 더 무비': '195975', '안녕 베일리': '181700', '쉰들러 리스트': '14450', '서유기 2 - 선리기연': '18543', '클레멘타인': '37886'} 50

 

[참고] 이수안컴퓨터연구소

 

댓글