ABOUT ME

-

  • 파이썬 크롤링(Crawling) 연습 - 네이버 영화 평점/리뷰, 영화코드 추출
    코딩 연습/코딩배우기 2020. 11. 4. 22:14

     

    ■ 네이버 영화 사이트에 있는 평점/리뷰의 제목과 평점을 추출하여 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
    

     

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

     

Designed by goodthings4me.