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개는 드립니다'
▷ 현재 상영작 영화 코드를 추출하고, 위 함수를 호출하여 평점/리뷰를 추출
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 |
댓글