728x90
쥬피터로 아래 파일을 열어 보시면 더 예쁘게 나와요~
1. 상영 중인 영화 평점 추출하기¶
1.1 원하는 웹페이지 선정하기¶
- 국내 3대 메이저 영화관 개수
CGV는 171개
롯데시네마는 130개
메가박스는 101개
- 가장 인기있는 영화관은 CGV라 판단하여 CGV 웹페이지 선정!!
In [1]:
url = "http://www.cgv.co.kr/movies/" # CGV 웹페이지 들고오기
# 해당 페이지의 page source를 직접 가져옵니다.
from urllib.request import urlopen # import requests 구문도 가능
source = urlopen(url).read()
1.2 beautifulsoup를 이용해서 태그에서 정보 가져오기¶
In [2]:
import bs4
source = bs4.BeautifulSoup(source,'lxml')
1.3 원하는 영화에 들어가는 코드 파악하기¶
모가디슈 : http://www.cgv.co.kr/movies/detail-view/?midx=84775
정글 크루즈 : http://www.cgv.co.kr/movies/detail-view/?midx=84743
방법-재차의 : http://www.cgv.co.kr/movies/detail-view/?midx=84774
모두 같은 값을 가지며 midx= 이후의 숫자만 다르다는 것을 파악할 수 있다.
In [3]:
# OOOO 포스터를 통해 숫자 추출하기
date = source.find('img', alt="모가디슈 포스터")
date
Out[3]:
<img alt="모가디슈 포스터" onerror="errorImage(this)" src="https://img.cgv.co.kr/Movie/Thumbnail/Poster/000084/84775/84775_320.jpg"/>
In [4]:
# 숫자 추출 방법 1
mn = int(date['src'].split('/')[-2])
mn
Out[4]:
84775
In [5]:
# 숫자 추출 방법 2
date1 = str(date)
mn = int(date1.split('/')[-3])
mn
Out[5]:
84775
In [6]:
new_url = f'http://www.cgv.co.kr/movies/detail-view/?midx={mn}'
new_url
Out[6]:
'http://www.cgv.co.kr/movies/detail-view/?midx=84775'
In [7]:
# 숫자 추출 함수 만들기
movie_name = input()
def movie_num(movie_name):
url = "http://www.cgv.co.kr/movies/"
from urllib.request import urlopen
source = urlopen(url).read()
import bs4
source = bs4.BeautifulSoup(source,'lxml')
date = source.find('img', alt="{} 포스터" .format(movie_name))
mn = int(date['src'].split('/')[-2])
new_url = f'http://www.cgv.co.kr/movies/detail-view/?midx={mn}'
print(new_url)
movie_num(movie_name)
모가디슈
http://www.cgv.co.kr/movies/detail-view/?midx=84775
1.4 상영 중인 영화 목록 추출하기¶
In [8]:
import requests
from bs4 import BeautifulSoup
url = 'http://www.cgv.co.kr/movies/'
res = requests.get(url)
soup = BeautifulSoup(res.text)
In [9]:
titles = soup.find('div',class_='wrap-movie-chart')
titless = titles.find_all('strong',class_='title')
title_name = []
title_name += [title.text for title in titless]
title_name
Out[9]:
['싱크홀', '모가디슈', '프리 가이', '더 수어사이드 스쿼드', '보스 베이비 2', '블랙 위도우', '그린 나이트']
In [10]:
print("상영 중인 인기 영화 7개")
for i in range(len(title_name)):
print("%d 번째 영화 : %s" %(i+1,title_name[i]))
상영 중인 인기 영화 7개
1 번째 영화 : 싱크홀
2 번째 영화 : 모가디슈
3 번째 영화 : 프리 가이
4 번째 영화 : 더 수어사이드 스쿼드
5 번째 영화 : 보스 베이비 2
6 번째 영화 : 블랙 위도우
7 번째 영화 : 그린 나이트
※ 상세 내용 추출¶
In [11]:
box = soup.find('div',class_='sect-movie-chart')
percent = box.find_all('strong',class_='percent')
percent_list = []
percent_list += [per.text[3:] for per in percent]
dates = box.find_all('span',class_='txt-info')
dates_list = []
dates_list += [date.text.strip()[:10] for date in dates]
In [12]:
import pandas as pd
movie_df = pd.DataFrame({"영화 제목" : title_name,
"예매율" : percent_list,
"개봉일" : dates_list})
movie_df
Out[12]:
영화 제목 | 예매율 | 개봉일 | |
---|---|---|---|
0 | 싱크홀 | 36.2% | 2021.08.11 |
1 | 모가디슈 | 21.8% | 2021.07.28 |
2 | 프리 가이 | 13.6% | 2021.08.11 |
3 | 더 수어사이드 스쿼드 | 4.4% | 2021.08.04 |
4 | 보스 베이비 2 | 1.9% | 2021.07.21 |
5 | 블랙 위도우 | 1.0% | 2021.07.07 |
6 | 그린 나이트 | 0.9% | 2021.08.05 |
1.5 사이트 내에서 최신 리뷰 추출해 보기¶
requests 방법을 통해 추출하고 싶었으나 복잡한 구조로 인해 방법 찾기에 실패하였다... ㅜ
Selenium을 사용하여 추출
Selenium은 다운 받아야 사용 가능!
In [13]:
!pip install Selenium
Requirement already satisfied: Selenium in c:\work\envs\datascience\lib\site-packages (3.141.0)
Requirement already satisfied: urllib3 in c:\work\envs\datascience\lib\site-packages (from Selenium) (1.26.4)
In [14]:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time
import pandas as pd
from selenium.common.exceptions import NoSuchElementException
In [15]:
def get_movie_reviews(url, page_num=10):
chrome_driver = 'C:/dev_python/webdriver/chromedriver.exe'
wd = webdriver.Chrome(chrome_driver)
wd.get(url)
# 빈 리스트 생성하기
writer_list=[]
review_list=[]
date_list=[]
for page_no in range(1,page_num+1): # 1페이지에서 page_num까지의 리뷰 추출
try:
page_ul = wd.find_element_by_id('paging_point') # 페이지 포인트 코드 추출
page_a = page_ul.find_element_by_link_text(str(page_no))
page_a.click()
time.sleep(2) # 페이지 로딩까지의 시간 두기
writers = wd.find_elements_by_class_name('writer-name')
writer_list += [writer.text for writer in writers]
reviews = wd.find_elements_by_class_name('box-comment')
review_list += [ review.text for review in reviews ]
dates = wd.find_elements_by_class_name('day')
date_list += [date.text for date in dates]
if page_no % 10 == 0: # 10이상의 값을 만났을 때
next_button = page_ul.find_element_by_class_name("paging-side")
next_button.click()
time.sleep(1)
except NoSuchElementException:
print("불러올 페이지가 없습니다.")
break
movie_review_df = pd.DataFrame({"Writer" : writer_list,
"Review" : review_list,
"Date" : date_list})
wd.close()
return movie_review_df
In [16]:
url = new_url # movie_num 함수를 통해 추출한 url
get_movie_reviews(url, 3) # 10이상의 페이지도 가능하다~
Out[16]:
Writer | Review | Date | |
---|---|---|---|
0 | 정클룬 | 추격씬 왜이래요???? | 2021.08.13 |
1 | rl**0810 | 무서웠지만 마지막은 감동이네요 조인성 잘생겼다!! | 2021.08.13 |
2 | 핑방봉 | 한시도 긴장의 끈을 놓을 수 없었어요 ! 재밌어요 | 2021.08.13 |
3 | 뚜백뚜 | 총이 장난감이 된 아이들 | 2021.08.13 |
4 | fl**103 | 색다른 배경과 통역이 필요없는 같은 편 | 2021.08.13 |
5 | 중하중하중하초 | 김윤석님이 나오는 영화라 무조건 고곱~~~ | 2021.08.13 |
6 | 귀염둥이맘 | 믿고보는 류승완 감독님 진짜~~영화를 참 잘만드시네요! 감동과 긴박감 재미~~ 모처... | 2021.08.13 |
7 | su**e034789 | 무난하게~~즐길만한.. | 2021.08.13 |
8 | 뽀앵이 | 실화라니깐 잼나게 생각이란걸 하면서 잘 봤어요~~역시 연기력 짱 배우님들은 넘 좋았... | 2021.08.13 |
9 | 쀼잉잉 | 긴장감 있고 몰입도 좋았어요! | 2021.08.13 |
10 | ma**umik | 우리 인성씨 화이팅 조인성은 무조건 옳다 | 2021.08.13 |
11 | 햄쮜성 | 연기도 좋았고 볼만한거같아요 | 2021.08.13 |
12 | wo**w0108 | 재밋엇습니다 강추~! | 2021.08.13 |
13 | mk**213 | 재미있게 잘봤어요... | 2021.08.13 |
14 | wl**s31322 | 재밋어요 볼만해요 추천함 ㅎㅎ | 2021.08.13 |
15 | Ich liebe Filme. | 실화를 바탕으로 했다 하니 더 공감이 되고.. 소말리아 내전이 우리나라 민주화 운동... | 2021.08.13 |
16 | 큰콩쥐콩 | 더운여름 시원하게 잘봤습니다~ | 2021.08.13 |
17 | 영화가땡길때 | 시간 순삭! 재미있네요 | 2021.08.13 |
1.6 CGV 사이트 내에서 인기 리뷰 추출해 보기¶
In [17]:
def get_movie_reviews(url, page_num=10):
chrome_driver = 'C:/dev_python/webdriver/chromedriver.exe'
wd = webdriver.Chrome(chrome_driver)
wd.get(url)
# 빈 리스트 생성하기
writer_list=[]
review_list=[]
date_list=[]
good_list=[]
page_b = wd.find_elements_by_class_name("sortTab")
page_b[1].click()
time.sleep(3)
for page_no in range(1,page_num+1):
try:
page_ul = wd.find_element_by_id('paging_point') # 페이지 포인트 코드 추출
page_a = page_ul.find_element_by_link_text(str(page_no))
page_a.click()
time.sleep(2) # 페이지 로딩까지의 시간 두기
writers = wd.find_elements_by_class_name('writer-name')
writer_list += [writer.text for writer in writers]
reviews = wd.find_elements_by_class_name('box-comment')
review_list += [ review.text for review in reviews ]
dates = wd.find_elements_by_class_name('day')
date_list += [date.text for date in dates]
goods = wd.find_elements_by_id('idLikeValue') # 좋아요 수 변수 추가
good_list += [good.text for good in goods]
if page_no % 10 == 0: # 10이상의 값을 만났을 때
next_button = page_ul.find_element_by_class_name("paging-side")
next_button.click()
time.sleep(1)
except NoSuchElementException:
print("불러올 페이지가 없습니다.")
break
movie_review_df = pd.DataFrame({"Writer" : writer_list,
"Review" : review_list,
"Date" : date_list,
"Goods" : good_list})
wd.close()
return movie_review_df
In [18]:
url = new_url
get_movie_reviews(url, page_num=2) # page_num은 변경 가능
Out[18]:
Writer | Review | Date | Goods | |
---|---|---|---|---|
0 | copabears | 간만에 괜찮은 한국영화 한편이 나왔다... | 2021.07.25 | 83 |
1 | 취향저격 빵야빵야 | 간만에 괜찮은 한국영화 본 듯. 탄탄한 스토리라인에, 믿고보는 연기력, 끝까지 긴장... | 2021.07.25 | 59 |
2 | 망고맛주스 | 신파가 거의 없어요. 몰입감 상당했고 배우들 연기도 대박이네요. 정말 재밌게 봤습니... | 2021.07.24 | 55 |
3 | 코로나야가라 | 과장도 억지도 없이 담백한데 생각할 거리들을 던져 주네요. 잘 봤습니다~ | 2021.07.26 | 46 |
4 | 4DX_holic | 극적인 요소는 재밌었음. 실제 역사 기반으로 만들었으나 실제로는 국민들을 고통속으로... | 2021.07.26 | 41 |
5 | 웅알이 | 신파는 90프로 없어요 배우들 연기야 최고구요 총격사운드 진짜 좋네요 수요일에 아맥... | 2021.07.25 | 37 |
6 | 자유별지구인 | 천 만 가즈아!!! 역시 류승완~홈런쳤다!!! | 2021.07.26 | 34 |
7 | david h | 올 여름 책임질 한국형 블록버스터 배우들의 연기가 인상적이고 재미와 감동이 있는 작품 | 2021.07.25 | 31 |
8 | 하얀완두콩 | 감독 류승완, 이름값 했다!!!! | 2021.07.25 | 29 |
9 | 영화보는세상 | 역시.류승완 감독다운 연출솜씨 실화를 완벽에 가까운 탄탄한 스토리에 조인성 허준호 ... | 2021.07.25 | 28 |
10 | 현ok | 엄마가 기대하셔서 보여드렸는데 연기 좋았고 재밌었다고 하네요 | 2021.07.24 | 27 |
11 | ll경2ll | 시사회 당첨 덕분에 미리 관람했네요 라인업도 최고 ! 생동감 있게 잘 봤습니다 | 2021.07.24 | 27 |
In [19]:
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))
728x90
'Ccode > 크롤링(crawling)' 카테고리의 다른 글
당일 주가 정보 크롤링 (0) | 2022.07.20 |
---|---|
유튜브 댓글 크롤링(crawling) (0) | 2022.06.24 |