-
파이썬 크롤링(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개는 드립니다'
▷ 현재 상영작 영화 코드를 추출하고, 위 함수를 호출하여 평점/리뷰를 추출
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
[참고] 이수안컴퓨터연구소
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
파이썬 크롤링(Crawling) 연습 - BeautifulSoup Documentation #2 (find_all, find, select 등) (0) 2020.11.08 파이썬 크롤링(Crawling) 연습 - BeautifulSoup Documentation #1 (html 태그로 접근, 객체 4종류 등) (0) 2020.11.07 파이썬 크롤링(Crawling) 연습 - BeautifulSoup 활용 기초 (0) 2020.11.03 파이썬 크롤링(Crawling) 연습 - Daum에서 검색한 전화번호의 기본 정보 추출 (0) 2020.11.01 파이썬 크롤링(Crawling) 연습 - find(), find_all() 사용한 네이버 증시 주가 추출 (0) 2020.10.29