본문 바로가기

학원/Python

데이터 수집 - 네이버 영화 순위

NAVER_MOVIE

네이버 현재 상영중 영화 순위

In [1]:
%%html
<style type='text/css'>
.CodeMirror{ font-size: 14px; font-family: callable}
</style>
In [2]:
# 라이브러리
import requests
from bs4 import BeautifulSoup
from datetime import date, timedelta
In [3]:
# 날짜
yesterday = date.today() - timedelta(1)
time = yesterday.strftime('%Y%m%d')

# 주소
url = 'https://movie.naver.com/movie/sdb/rank/rmovie.nhn'
#params = {'sel':'cnt', 'date':time} #조회수
params = {'sel':'cur', 'date':time} #평점순(현재상영)
#params = {'sel':'pnt', 'date':time} #평점순(모든영화)
In [4]:
# get
# get 요청
response = requests.get(url, params=params)
status_code = response.status_code
print(status_code)

if status_code == 200:
    text = response.text    
else:
    soup == 'error'
200
In [5]:
# str ==> BeautifulSoup
soup = BeautifulSoup(text)
In [6]:
# 영화 전체정보
movie_all = soup.select_one('.list_ranking')
#movie_all
In [7]:
# 랭킹
img_one = movie_all.select_one('img') # 한개
img_all = movie_all.select('img') # 전부
In [8]:
# 타이틀
a_one = movie_all.select_one('a') # 한개
a_all = movie_all.select('a') # 전부
In [9]:
# 평점
point_one = movie_all.select_one('td.point')
point_all = movie_all.select('td.point')
In [10]:
# 랭킹 리스트에 담기
movie_rank_one = img_one['alt']

rank_list = []
for item in img_all:
    if len(item['alt']) == 3:
        item['alt'] = '10'
    else :
        movie_rank_one = item['alt']
    rank_list.append(movie_rank_one)
rank_list = rank_list[0::3]
rank_list
Out[10]:
['01',
 '02',
 '03',
 '04',
 '05',
 '06',
 '07',
 '08',
 '09',
 'na',
 '11',
 '12',
 '13',
 '14',
 '15',
 '16',
 '17',
 '18',
 '19',
 '20',
 '21',
 '22',
 '23',
 '24',
 '25',
 '26',
 '27',
 '28',
 '29',
 '30',
 '31',
 '32',
 '33',
 '34',
 '35',
 '36',
 '37',
 '38',
 '39',
 '40',
 '41',
 '42',
 '43',
 '44',
 '45',
 '46',
 '47',
 '48',
 '49',
 '50']
In [11]:
# 타이틀 리스트에 담기
movie_title_one = a_one.text

title_list = []
for item in a_all:
    movie_title_one = item.text
    title_list.append(movie_title_one)
title_list = title_list[0::2]
title_list
Out[11]:
['가버나움',
 '위대한 쇼맨',
 '패왕별희 디 오리지널',
 '톰보이',
 '나, 다니엘 블레이크',
 '러빙 빈센트',
 '어느 가족',
 '시간을 달리는 소녀',
 '스타 이즈 본',
 '늑대아이',
 '타오르는 여인의 초상',
 '타샤 튜더',
 '택시운전사',
 '국제시장',
 '동감',
 '씨민과 나데르의 별거',
 '신세계',
 '마담 프루스트의 비밀정원',
 '트롤: 월드 투어',
 '1917',
 '라이프 오브 파이',
 '작은 아씨들',
 '가장 따뜻한 색, 블루',
 '마미',
 '썸머 워즈',
 '찬실이는 복도 많지',
 '라라랜드',
 '비커밍 제인',
 '괴물의 아이',
 '극한직업',
 '기생충',
 '아비정전',
 '보리밭을 흔드는 바람',
 '명량',
 '로렌스 애니웨이 ',
 '영웅: 천하의 시작',
 '프리즌 이스케이프',
 '블루 발렌타인',
 '콜드 워',
 '문라이즈 킹덤',
 '프란시스 하',
 '프랭크',
 '날씨의 아이',
 '신과함께-죄와 벌',
 '오직 사랑하는 이들만이 살아남는다',
 '멜랑콜리아',
 '신과함께-인과 연',
 '엽문4: 더 파이널',
 '인비저블맨',
 '멀홀랜드 드라이브']
In [12]:
# 평점 리스트에 담기
movie_point_one = point_one.text

point_list = []
for item in point_all:
    movie_point_one = item.text
    point_list.append(movie_point_one)
point_list
Out[12]:
['9.59',
 '9.39',
 '9.30',
 '9.28',
 '9.27',
 '9.22',
 '9.20',
 '9.20',
 '9.18',
 '9.11',
 '9.04',
 '9.03',
 '9.03',
 '9.01',
 '8.99',
 '8.95',
 '8.92',
 '8.92',
 '8.89',
 '8.88',
 '8.86',
 '8.80',
 '8.76',
 '8.68',
 '8.67',
 '8.62',
 '8.60',
 '8.57',
 '8.51',
 '8.50',
 '8.50',
 '8.46',
 '8.46',
 '8.44',
 '8.42',
 '8.39',
 '8.37',
 '8.30',
 '8.29',
 '8.10',
 '8.09',
 '7.94',
 '7.94',
 '7.83',
 '7.74',
 '7.72',
 '7.71',
 '7.67',
 '7.60',
 '7.50']
In [13]:
movie_rank_list = []
for i in range(50):
    movie_rank_dict = dict()
    movie_rank_dict['순위'] = rank_list[i]
    movie_rank_dict['타이틀'] = title_list[i]
    movie_rank_dict['평점'] = point_list[i]
    movie_rank_list.append(movie_rank_dict)
print(time)
movie_rank_list
20200607
Out[13]:
[{'순위': '01', '타이틀': '가버나움', '평점': '9.59'},
 {'순위': '02', '타이틀': '위대한 쇼맨', '평점': '9.39'},
 {'순위': '03', '타이틀': '패왕별희 디 오리지널', '평점': '9.30'},
 {'순위': '04', '타이틀': '톰보이', '평점': '9.28'},
 {'순위': '05', '타이틀': '나, 다니엘 블레이크', '평점': '9.27'},
 {'순위': '06', '타이틀': '러빙 빈센트', '평점': '9.22'},
 {'순위': '07', '타이틀': '어느 가족', '평점': '9.20'},
 {'순위': '08', '타이틀': '시간을 달리는 소녀', '평점': '9.20'},
 {'순위': '09', '타이틀': '스타 이즈 본', '평점': '9.18'},
 {'순위': 'na', '타이틀': '늑대아이', '평점': '9.11'},
 {'순위': '11', '타이틀': '타오르는 여인의 초상', '평점': '9.04'},
 {'순위': '12', '타이틀': '타샤 튜더', '평점': '9.03'},
 {'순위': '13', '타이틀': '택시운전사', '평점': '9.03'},
 {'순위': '14', '타이틀': '국제시장', '평점': '9.01'},
 {'순위': '15', '타이틀': '동감', '평점': '8.99'},
 {'순위': '16', '타이틀': '씨민과 나데르의 별거', '평점': '8.95'},
 {'순위': '17', '타이틀': '신세계', '평점': '8.92'},
 {'순위': '18', '타이틀': '마담 프루스트의 비밀정원', '평점': '8.92'},
 {'순위': '19', '타이틀': '트롤: 월드 투어', '평점': '8.89'},
 {'순위': '20', '타이틀': '1917', '평점': '8.88'},
 {'순위': '21', '타이틀': '라이프 오브 파이', '평점': '8.86'},
 {'순위': '22', '타이틀': '작은 아씨들', '평점': '8.80'},
 {'순위': '23', '타이틀': '가장 따뜻한 색, 블루', '평점': '8.76'},
 {'순위': '24', '타이틀': '마미', '평점': '8.68'},
 {'순위': '25', '타이틀': '썸머 워즈', '평점': '8.67'},
 {'순위': '26', '타이틀': '찬실이는 복도 많지', '평점': '8.62'},
 {'순위': '27', '타이틀': '라라랜드', '평점': '8.60'},
 {'순위': '28', '타이틀': '비커밍 제인', '평점': '8.57'},
 {'순위': '29', '타이틀': '괴물의 아이', '평점': '8.51'},
 {'순위': '30', '타이틀': '극한직업', '평점': '8.50'},
 {'순위': '31', '타이틀': '기생충', '평점': '8.50'},
 {'순위': '32', '타이틀': '아비정전', '평점': '8.46'},
 {'순위': '33', '타이틀': '보리밭을 흔드는 바람', '평점': '8.46'},
 {'순위': '34', '타이틀': '명량', '평점': '8.44'},
 {'순위': '35', '타이틀': '로렌스 애니웨이 ', '평점': '8.42'},
 {'순위': '36', '타이틀': '영웅: 천하의 시작', '평점': '8.39'},
 {'순위': '37', '타이틀': '프리즌 이스케이프', '평점': '8.37'},
 {'순위': '38', '타이틀': '블루 발렌타인', '평점': '8.30'},
 {'순위': '39', '타이틀': '콜드 워', '평점': '8.29'},
 {'순위': '40', '타이틀': '문라이즈 킹덤', '평점': '8.10'},
 {'순위': '41', '타이틀': '프란시스 하', '평점': '8.09'},
 {'순위': '42', '타이틀': '프랭크', '평점': '7.94'},
 {'순위': '43', '타이틀': '날씨의 아이', '평점': '7.94'},
 {'순위': '44', '타이틀': '신과함께-죄와 벌', '평점': '7.83'},
 {'순위': '45', '타이틀': '오직 사랑하는 이들만이 살아남는다', '평점': '7.74'},
 {'순위': '46', '타이틀': '멜랑콜리아', '평점': '7.72'},
 {'순위': '47', '타이틀': '신과함께-인과 연', '평점': '7.71'},
 {'순위': '48', '타이틀': '엽문4: 더 파이널', '평점': '7.67'},
 {'순위': '49', '타이틀': '인비저블맨', '평점': '7.60'},
 {'순위': '50', '타이틀': '멀홀랜드 드라이브', '평점': '7.50'}]
In [14]:
# 좀 더 효율적인 방법

movie_table = soup.select_one('.list_ranking')
movie_tr_all = movie_table.select('tr')

movie_tr_one = movie_tr_all[2]
movie_title = movie_tr_one.select_one('a[title]').text
movie_point = movie_tr_one.select_one('td.point').text

movie_title_point_list = []
for item in movie_tr_all:
    movie_title = item.select_one('a[title]')
    movie_point = item.select_one('td.point')
    title = ''
    point = 0
    if movie_title:
        title = movie_title.text
    else:
        continue
    if movie_point:
        point = movie_point.text
    else:
        continue
    movie_title_point_list.append((title, point))

movie_title_point_list
Out[14]:
[('가버나움', '9.59'),
 ('위대한 쇼맨', '9.39'),
 ('패왕별희 디 오리지널', '9.30'),
 ('톰보이', '9.28'),
 ('나, 다니엘 블레이크', '9.27'),
 ('러빙 빈센트', '9.22'),
 ('어느 가족', '9.20'),
 ('시간을 달리는 소녀', '9.20'),
 ('스타 이즈 본', '9.18'),
 ('늑대아이', '9.11'),
 ('타오르는 여인의 초상', '9.04'),
 ('타샤 튜더', '9.03'),
 ('택시운전사', '9.03'),
 ('국제시장', '9.01'),
 ('동감', '8.99'),
 ('씨민과 나데르의 별거', '8.95'),
 ('신세계', '8.92'),
 ('마담 프루스트의 비밀정원', '8.92'),
 ('트롤: 월드 투어', '8.89'),
 ('1917', '8.88'),
 ('라이프 오브 파이', '8.86'),
 ('작은 아씨들', '8.80'),
 ('가장 따뜻한 색, 블루', '8.76'),
 ('마미', '8.68'),
 ('썸머 워즈', '8.67'),
 ('찬실이는 복도 많지', '8.62'),
 ('라라랜드', '8.60'),
 ('비커밍 제인', '8.57'),
 ('괴물의 아이', '8.51'),
 ('극한직업', '8.50'),
 ('기생충', '8.50'),
 ('아비정전', '8.46'),
 ('보리밭을 흔드는 바람', '8.46'),
 ('명량', '8.44'),
 ('로렌스 애니웨이 ', '8.42'),
 ('영웅: 천하의 시작', '8.39'),
 ('프리즌 이스케이프', '8.37'),
 ('블루 발렌타인', '8.30'),
 ('콜드 워', '8.29'),
 ('문라이즈 킹덤', '8.10'),
 ('프란시스 하', '8.09'),
 ('프랭크', '7.94'),
 ('날씨의 아이', '7.94'),
 ('신과함께-죄와 벌', '7.83'),
 ('오직 사랑하는 이들만이 살아남는다', '7.74'),
 ('멜랑콜리아', '7.72'),
 ('신과함께-인과 연', '7.71'),
 ('엽문4: 더 파이널', '7.67'),
 ('인비저블맨', '7.60'),
 ('멀홀랜드 드라이브', '7.50')]

'학원 > Python' 카테고리의 다른 글

데이터수집- XML - 기상청  (0) 2020.06.08
데이터 수집 - 다음뉴스  (0) 2020.06.08
데이터수집 - 네이버 책 검색  (0) 2020.06.08
스크래핑과 크롤링  (0) 2020.06.02
tinyDB 설치와 조작  (0) 2020.06.02