티스토리 뷰

시카고 샌드위치 맛집 분석 - 복사본 (3)

제 3장 시카고 샌드위치 맛집 분석

구성 및 블로그 진행 과정

3-1 웹데이터를 가져오는 Beautiful Soup 익히기
3-2 크롬 개발자 도구를 이용해서 원하는 태그 찾기
3-3 실전: 시카고 샌드위치 맛집 소개 사이트에 접근하기
3-4 접근한 웹 페이지에서 원하는 데이터 추출하고 정리하기
-------------------------------------------------------
3-5 다수의 웹 페이지에 자동으로 접근해서 원하는 정보 가져오기
3-6 Jupyter Notebook에서 상태 진행바를 쉽게 만들어주는 tqdm 모듈
3-7 상태 진행바까지 적용하고 다시 샌드위치 페이지 50개에 접근하기
3-8 50개 웹 페이지에 대한 정보 가져오기
3-9 맛집 위치를 지도에 표기하기
-------------------------------------------------------
3-10 네이버 영화 평점 기준 영화의 평점 변화 확인하기
3-11 영화별 날짜 변화에 따른 평점 변화 확인하기

출처: 파이썬으로 데이터 주무르기 by 민형기


3-10 네이버 영화 평점 기준 영화의 평점 변화 확인하기

네이버에서는 영화 평점을 보여주는 사이트가 있다. 여기서는 인기 있는 영화를 알아볼 수도 있지만 지난 날짜의 인기도 확인할 수 있다. https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=cur&date=20190706 에 접근해보면 영화 평점순으로 정렬되어 있는 정보를 만날 수 있다.

In [132]:
Image.open('crawling4.png')
Out[132]:
In [133]:
Image.open('crawling5.png')
Out[133]:
In [216]:
# Beautiful Soup와 pandas를 import
from bs4 import BeautifulSoup
import pandas as pd
In [217]:
# 주소 읽어오기
from urllib.request import urlopen

url_base = "http://movie.naver.com/"
url_syb = "movie/sdb/rank/rmovie.nhn?sel=cur&date=20190706"

page = urlopen(url_base+url_syb)

soup = BeautifulSoup(page, "html.parser")
In [237]:
soup.find_all('div','tit5')[:10]
Out[237]:
[<div class="tit5">
 <a href="/movie/bi/mi/basic.nhn?code=174830" title="가버나움">가버나움</a>
 </div>, <div class="tit5">
 <a href="/movie/bi/mi/basic.nhn?code=163788" title="알라딘">알라딘</a>
 </div>, <div class="tit5">
 <a href="/movie/bi/mi/basic.nhn?code=136900" title="어벤져스: 엔드게임">어벤져스: 엔드게임</a>
 </div>, <div class="tit5">
 <a href="/movie/bi/mi/basic.nhn?code=35901" title="살인의 추억">살인의 추억</a>
 </div>, <div class="tit5">
 <a href="/movie/bi/mi/basic.nhn?code=183132" title="교회오빠">교회오빠</a>
 </div>, <div class="tit5">
 <a href="/movie/bi/mi/basic.nhn?code=183136" title="뽀로로 극장판 보물섬 대모험">뽀로로 극장판 보물섬 대모험</a>
 </div>, <div class="tit5">
 <a href="/movie/bi/mi/basic.nhn?code=18781" title="이웃집 토토로">이웃집 토토로</a>
 </div>, <div class="tit5">
 <a href="/movie/bi/mi/basic.nhn?code=10105" title="사랑은 비를 타고">사랑은 비를 타고</a>
 </div>, <div class="tit5">
 <a href="/movie/bi/mi/basic.nhn?code=173692" title="바울">바울</a>
 </div>, <div class="tit5">
 <a href="/movie/bi/mi/basic.nhn?code=101966" title="토이 스토리 4">토이 스토리 4</a>
 </div>]
In [219]:
# 첫번째 제목
soup.find_all('div','tit5')[0].a.string
Out[219]:
'그린 북'
In [220]:
# 첫번째 평점
soup.find_all('td','point')[0].string
Out[220]:
'9.61'
In [221]:
# 5월 1일부터 60일간의 날짜를 정의하자
date = pd.date_range('2019-5-1', periods=60, freq='D')
date
Out[221]:
DatetimeIndex(['2019-05-01', '2019-05-02', '2019-05-03', '2019-05-04',
               '2019-05-05', '2019-05-06', '2019-05-07', '2019-05-08',
               '2019-05-09', '2019-05-10', '2019-05-11', '2019-05-12',
               '2019-05-13', '2019-05-14', '2019-05-15', '2019-05-16',
               '2019-05-17', '2019-05-18', '2019-05-19', '2019-05-20',
               '2019-05-21', '2019-05-22', '2019-05-23', '2019-05-24',
               '2019-05-25', '2019-05-26', '2019-05-27', '2019-05-28',
               '2019-05-29', '2019-05-30', '2019-05-31', '2019-06-01',
               '2019-06-02', '2019-06-03', '2019-06-04', '2019-06-05',
               '2019-06-06', '2019-06-07', '2019-06-08', '2019-06-09',
               '2019-06-10', '2019-06-11', '2019-06-12', '2019-06-13',
               '2019-06-14', '2019-06-15', '2019-06-16', '2019-06-17',
               '2019-06-18', '2019-06-19', '2019-06-20', '2019-06-21',
               '2019-06-22', '2019-06-23', '2019-06-24', '2019-06-25',
               '2019-06-26', '2019-06-27', '2019-06-28', '2019-06-29'],
              dtype='datetime64[ns]', freq='D')
In [222]:
import urllib
from tqdm import tqdm_notebook

movie_date = []
movie_name = []
movie_point = []

for today in tqdm_notebook(date):
    html = 'http://movie.naver.com/' + \
                                    'movie/sdb/rank/rmovie.nhn?sel=cur&date={date}'
    response = urlopen(html.format(date=
                                  urllib.parse.quote(today.strftime('%Y%m%d'))))
    soup = BeautifulSoup(response, 'html.parser')
    
    end = len(soup.find_all('td','point'))
    
    movie_date.extend([today for n in range(0, end)])
    movie_name.extend([soup.find_all('div', 'tit5')[n].a.string for n in range(0, end)])
    movie_point.extend([soup.find_all('td','point')[n].string for n in range(0, end)])

html을 지정할 때 중괄호 {}로 date라고 잡은 것은 그 밑에 response라는 변수에서 {date}를 변수로 취급하고 내용을 바꿀 것이기 때문이다. 그러고 나서 제목과 포인트를 읽어왔다.

In [223]:
# 읽은 내용을 pandas로 저정. 날짜별로 영화와 포인트가 저장.
movie = pd.DataFrame({'date':movie_date, 'name':movie_name, 'point':movie_point})

movie.head()
Out[223]:
date name point
0 2019-05-01 그린 북 9.62
1 2019-05-01 가버나움 9.60
2 2019-05-01 베일리 어게인 9.54
3 2019-05-01 어벤져스: 엔드게임 9.44
4 2019-05-01 폴란드로 간 아이들 9.33
In [224]:
len(movie_date), len(movie_name), len(movie_point)
Out[224]:
(2723, 2723, 2723)
In [225]:
movie.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2723 entries, 0 to 2722
Data columns (total 3 columns):
date     2723 non-null datetime64[ns]
name     2723 non-null object
point    2723 non-null object
dtypes: datetime64[ns](1), object(2)
memory usage: 63.9+ KB
In [226]:
movie['point'] = movie['point'].astype(float)
movie.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2723 entries, 0 to 2722
Data columns (total 3 columns):
date     2723 non-null datetime64[ns]
name     2723 non-null object
point    2723 non-null float64
dtypes: datetime64[ns](1), float64(1), object(1)
memory usage: 63.9+ KB
In [227]:
# pivot_table을 사용하여 영화별로 점수의 합산으로 데이터를 보자.
# aggfunc으로 np.sum을 이용해서 합산을 해야 영화별 점수의 합계로 정렬될 것이다.
# 5월 1일부터 60일간 점수의 합산으로 볼 때 고득점 영화 1위부터 5위까지를 보여보자.
import numpy as np

movie_unique = pd.pivot_table(movie, index=['name'], aggfunc=np.sum)
movie_best = movie_unique.sort_values(by='point', ascending=False)
movie_best.head()
Out[227]:
point
name
어벤져스: 엔드게임 563.85
뽀로로 극장판 보물섬 대모험 557.52
일일시호일 523.50
라라랜드 472.45
가버나움 470.28
In [228]:
# 다음처럼 한 가지 영화만 추려서 날짜별 평점 변화를 확인할 수 있다.
tmp = movie.query('name==["알라딘"]')
tmp.head()
Out[228]:
date name point
1023 2019-05-23 알라딘 9.32
1065 2019-05-24 알라딘 9.31
1101 2019-05-25 알라딘 9.41
1141 2019-05-26 알라딘 9.48
1179 2019-05-27 알라딘 9.48
In [229]:
# 날짜별로 그래프를 그려보자
import matplotlib.pyplot as plt
%matplotlib inline

plt.figure(figsize=(12,8))
plt.plot(tmp['date'], tmp['point'])
plt.legend(loc='best')
plt.grid()
plt.show
Out[229]:
<function matplotlib.pyplot.show(*args, **kw)>

3-11 영화별 날짜 변화에 따른 평점 변화 확인하기

In [230]:
# 날짜별로 정리되어 있던 데이터를 pivot_table을 이용하여 세로축에는 날짜를 가로축에는 영화 제목을 넣을 수 있다.
movie_pivot = pd.pivot_table(movie, index=['date'], columns=['name'], values=['point'])

movie_pivot.head()
Out[230]:
point
name 0.0MHz 1919 유관순 28일 후 가버나움 가장 따뜻한 색, 블루 걸캅스 고양이 춤 고양이를 빌려드립니다 고질라: 킹 오브 몬스터 공작 ... 페이트 스테이 나이트 헤븐즈필 제2장 로스트 버터플라이 폴란드로 간 아이들 프란시스 하 플로리다 프로젝트 항거:유관순 이야기 헬보이 현기증 호랑이보다 무서운 겨울손님 호텔 뭄바이 황혼에서 새벽까지
date
2019-05-01 NaN 8.6 NaN 9.6 NaN NaN NaN NaN NaN NaN ... 7.90 9.33 NaN NaN NaN 7.23 8.74 NaN NaN NaN
2019-05-02 NaN 8.6 NaN 9.6 NaN NaN NaN NaN NaN NaN ... 7.90 9.33 NaN NaN NaN 7.23 8.74 NaN NaN NaN
2019-05-03 NaN 8.6 NaN 9.6 NaN NaN NaN NaN NaN NaN ... 7.90 9.33 NaN 8.59 8.59 7.22 NaN NaN NaN NaN
2019-05-04 NaN 8.6 NaN 9.6 NaN NaN NaN NaN NaN 6.85 ... 7.90 9.33 NaN 8.59 8.59 7.22 NaN NaN NaN NaN
2019-05-05 NaN 8.6 NaN 9.6 NaN NaN NaN NaN NaN 6.85 ... 7.91 9.33 NaN 8.59 8.59 7.22 NaN NaN NaN NaN

5 rows × 161 columns

In [231]:
movie_pivot.columns = movie_pivot.columns.droplevel()
In [232]:
movie_pivot.head()
Out[232]:
name 0.0MHz 1919 유관순 28일 후 가버나움 가장 따뜻한 색, 블루 걸캅스 고양이 춤 고양이를 빌려드립니다 고질라: 킹 오브 몬스터 공작 ... 페이트 스테이 나이트 헤븐즈필 제2장 로스트 버터플라이 폴란드로 간 아이들 프란시스 하 플로리다 프로젝트 항거:유관순 이야기 헬보이 현기증 호랑이보다 무서운 겨울손님 호텔 뭄바이 황혼에서 새벽까지
date
2019-05-01 NaN 8.6 NaN 9.6 NaN NaN NaN NaN NaN NaN ... 7.90 9.33 NaN NaN NaN 7.23 8.74 NaN NaN NaN
2019-05-02 NaN 8.6 NaN 9.6 NaN NaN NaN NaN NaN NaN ... 7.90 9.33 NaN NaN NaN 7.23 8.74 NaN NaN NaN
2019-05-03 NaN 8.6 NaN 9.6 NaN NaN NaN NaN NaN NaN ... 7.90 9.33 NaN 8.59 8.59 7.22 NaN NaN NaN NaN
2019-05-04 NaN 8.6 NaN 9.6 NaN NaN NaN NaN NaN 6.85 ... 7.90 9.33 NaN 8.59 8.59 7.22 NaN NaN NaN NaN
2019-05-05 NaN 8.6 NaN 9.6 NaN NaN NaN NaN NaN 6.85 ... 7.91 9.33 NaN 8.59 8.59 7.22 NaN NaN NaN NaN

5 rows × 161 columns

In [233]:
# 이 데이터에서 pivot_table의 결과로 붙은 컬럼 제목을 정리해보자.
# matplotlib에서의 한글 문제 설정
import platform
from matplotlib import font_manager, rc

path = 'c:/Windows/Fonts/malgun.ttf'
if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system... sorry~~~')
In [238]:
# 관심 있는 영화 몇 개를 지정해서 날짜별 변화를 확인
movie_pivot.plot(y=['맨 인 블랙: 인터내셔널', '존 윅 3: 파라벨룸', '알라딘', '토이 스토리 4', '기생충'],
                figsize=(16,6))
plt.legend(loc='best')
plt.grid()
plt.show()
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함