네이버 영화 페이지 종료로 다음 영화 페이지로 진행
- https://movie.daum.net/ranking/boxoffice/weekly
영화랭킹 탭 이동
영화랭킹에서 박스오피스 선택
웹 페이지 주소에는 많은 정보가 담겨 있다
원하는 정보를 얻기 위해서 변화시켜줘야 하는 주소의 규칙을 찾을 수 있다
# requirments
import pandas as pd
from urllib.request import urlopen
from bs4 import BeautifulSoup
url = "https://movie.daum.net/ranking/boxoffice/weekly"
response = urlopen(url)
#response.status
soup = BeautifulSoup(response, "html.parser")
print(soup.prettify())
# 영화 제목 태그
#soup.select("strong.tit_item>a.link_txt")
#soup.select(".tit_item")[0].find("a").text
#soup.select(".tit_item")[0].select_one("a").get_text()
#soup.find_all("strong", "tit_item")[0].a.text
soup.find_all("strong",{"class":"tit_item"})[0].get_text()
# 참고 사이트 : https://codemate.kr/@bombom/Day-14-%EC%9E%90%EC%9C%A0%EB%A1%9C%EC%9A%B4-%ED%81%AC%EB%A1%A4%EB%A7%81-1
# tbody -> t가 테이블 형태의 태그를 말함
# 영화 관객수 태그
#soup.find_all("span","txt_info")[0].find_all("span","info_txt")[1].text
soup.select(".txt_info")[14].select_one(".screen_out").parent.text
len(soup.find_all("strong","tit_item")), len(soup.find_all("span",{"class":"txt_info"}))
#soup.find_all("span",class_="txt_grade")[0].text
soup.select(".txt_info")[0].select(".info_txt")[1].string
# 영화 제목 리스트
end = len(soup.find_all("strong", {"class":"tit_item"}))
movie_name = []
for n in range(0, end):
movie_name.append(
soup.find_all("strong","tit_item")[n].a.string
)
movie_name
movie_name = [soup.find_all("strong","tit_item")[n].a.get_text() for n in range(0, end)]
movie_name
# 영화 관객수 리스트
import re
end = len(soup.find_all("span",{"class":"txt_info"}))
movie_audience = []
for n in range(0, end):
tmp = soup.select(".txt_info")[n].select_one(".screen_out").parent.text
tmp = tmp.replace("관객수","").replace("명","")
tmp = re.sub(",", "", tmp)
movie_audience.append(tmp)
movie_audience
# 전체 데이터 수 확인
len(movie_name), len(movie_audience)
#url = https://movie.daum.net/ranking/boxoffice/weekly?date=20230327
dates = pd.date_range("2022.01.01", periods=100, freq="D")
date_monday = []
dates[0].weekday()
for date in dates: # 다음 영화의 주간, 월간, 년간 데이터 제공하여 주간 데이터를 수집하는 것으로 변경
if date.weekday() == 0:
date_monday.append(date)
date_monday
date_monday[0]
date_monday[0].strftime("%Y.%m.%d") , date_monday[0].strftime('%Y%m%d')
# 문자열 format
test_string = "Hi, I'm {name}"
test_string.format(name = "hong gil dong")
#dir(test_string)
import time
from tqdm import tqdm
import re
movie_date = []
movie_name = []
movie_audience = []
for today in tqdm(date_monday):
url = "https://movie.daum.net/ranking/boxoffice/weekly?date={date}"
response = urlopen(url.format(date = today.strftime('%Y%m%d')))
soup = BeautifulSoup(response, "html.parser")
end = len(soup.find_all("span",{"class":"txt_info"}))
movie_date.extend([today for _ in range(0, end)])
movie_name.extend([soup.find_all("strong","tit_item")[n].a.string for n in range(0, end)])
for n in range(0, end):
tmp = soup.select(".txt_info")[n].select_one(".screen_out").parent.text
tmp = tmp.replace("관객수","").replace("명","")
tmp = re.sub(",", "", tmp)
#print(temp)
movie_audience.append(tmp)
time.sleep(0.5)
len(movie_date), len(movie_name), len(movie_audience)
movie_audience
movie = pd.DataFrame({
"date":movie_date,
"name":movie_name,
"audience":movie_audience
})
movie.tail()
movie.info()
movie["audience"] = movie["audience"].astype(float) #astype() : 데이터형 변경
movie.info()
# 데이터 저장
movie.to_csv("../data/03. daum_movie_data.csv", sep=",", encoding="utf-8")
df = pd.read_csv("../data/03. daum_movie_data.csv", index_col=0)
df
import numpy as np
import pandas as pd
movie = pd.read_csv("../data/03. daum_movie_data.csv", index_col=0)
movie.tail()
# 영화 이름으로 인덱스 설정
# 점수(daum 영화 관객수)의 합산 구하기
# 100일(daum 영화 기간 설정) 간 네이버(다음) 영화 평점(관객수) 기준 베스트&워스트 100 선정
# pivot table
movie_unique = pd.pivot_table(data = movie, index="name", aggfunc=np.sum)
movie_best = movie_unique.sort_values(by="audience", ascending=False) # 내림차순
movie_best.head()
tmp = movie.query("name == ['스파이더맨: 노 웨이 홈']") # 총 관객수로 누적된 값이라 그래프가 적절하진 않다;;
tmp
# 시각화
import matplotlib.pyplot as plt
from matplotlib import rc
rc("font", family="Malgun Gothic") # mac : Arial Unicode MS
#%matplotlib inline
get_ipython().run_line_magic("matplotlib", "inline")
# 총 관객수로 누적된 값이라 그래프가 적절하진 않다;;
plt.figure(figsize = (20, 8)) # x : 20 , y : 8
plt.plot(tmp["date"], tmp["audience"]) # 선 그래프 x축 날짜, y축 평점(관객수) → 날짜에 따른 평점(관객수 ) 변화를 선 그래프로 표현(시계열)
plt.xlabel("날짜")
plt.ylabel("관객수") # 평점
plt.xticks(rotation="vertical") #x축 항목을 세로로 표시하기
plt.legend(labels=["관객수 추이"], loc="best") # 평점 # loc = "best" : 가장 좋은 곳에 배치해라
plt.grid(True)
plt.show()
# 상위 10개 영화
movie_best.head(10)
# 하위 10개 영화
movie_best.tail(10)
movie_pivot = pd.pivot_table(data=movie, index="date", columns="name", values="audience")#values="point"
movie_pivot
movie_pivot.to_excel("../data/03. movie_pivot.xlsx")
#movie_pivot.columns = movie_pivot.columns.droplevel()
# 상단에 멀티로 행 이름이 생겼을 때 원하는 행을 삭제해서 줄일 수 있음
import platform
import seaborn as sns
from matplotlib import font_manager, rc
path = "C:/Windows/Fonts/malgun.ttf"
if platform.system() == "Darwin": # mac일 경우 한글 설정
rc("font", family="Arial Unicode MS")
elif platform.system() == "Windows": #window일 경우 한글 설정
font_name = font_manager.FontProperties(fname=path).get_name()
rc("font", family = font_name)
else:
print("Unknown system. sorry")
target_col = ["드라이브 마이 카", "경관의 피", "더 배트맨", "스파이더맨: 노 웨이 홈", "언차티드"]
plt.figure(figsize=(20, 8))
plt.title("날짜별 관객수")
plt.xlabel("날짜")
plt.ylabel("관객수") # 평점
plt.xticks(rotation="vertical")
plt.tick_params(bottom="off", labelbottom="off")
plt.plot(movie_pivot[target_col])
plt.legend(target_col, loc = "best") # plt.legend(target_col, loc = "best") : target_col별로 색을 설정하고 위치는 가장 좋은 곳으로 설정
plt.grid(True)
plt.show()
네이버 영화 페이지가 사라져서 daum 영화 페이지로 해보았는데 평점이 없고 관객수도 누적관객수라 그래프 그리는데에는 적절하지 않았던 것같다.... 😟
💻 출처 : 제로베이스 데이터 취업 스쿨