본문 바로가기
웹 크롤링/Jupyter Notebook - 크롤링

주피터 - 웹 크롤링 - 네이버 영화 평점순으로 크롤링

by 빵으니 2020. 6. 15.
NAVER_MOVIE

네이버 영화 평점순 크롤링

In [3]:
%%html
 
<!-- 에디터 폰트를 조정합니다. -->
<style type='text/css'>
.CodeMirror{
    font-size: 14px;
    font-family: consolas;
</style>

import

In [49]:
import requests
from bs4 import BeautifulSoup
import datetime # 날짜 처리 라이브러리(날짜가 text가 아닌 객체로 정의 되어있음)

url을 딕셔너리 형태로 담기 / GET 요청 => 함수에 담기

In [10]:
# 일별 순위를 쉽게 받기 위해 함수로 받아주기
def get_naver_movie(sel='cur', date='20200604'):
    url = 'https://movie.naver.com/movie/sdb/rank/rmovie.nhn'
    params = {'sel':sel,'date':date} # url 값에 함수 파라메터 넣어주기
    # get 요청
    response = requests.get(url, params=params)
    status_code = response.status_code
    
    if status_code == 200:
        text = response.text
        soup = BeautifulSoup(text)
    else:
        soup = 'error'
        
    return soup # 함수값 soup로 리턴
In [16]:
# 변수에 함수 담아주기 깔끔!
soup = get_naver_movie()
# print(soup)

클래스 가져오기

In [22]:
# 테이블 태그의 list_ranking 클래스
movie_table = soup.select_one('table.list_ranking') 
# print(movie_table)

# 하위 테이블 가져오기
movie_tr_all = movie_table.select('tr')
print(movie_tr_all[0])
<tr>
<th scope="col">순위</th>
<th scope="col">영화명</th>
<th colspan="3" scope="col">평점</th>
<th colspan="2" scope="col">변동폭</th>
</tr>

속성 값 가져오기

In [37]:
movie_tr_one = movie_tr_all[2]
movie_title = movie_tr_one.select_one('a[title]').text

# select_one은 text 따로 추출 필요, 간단하게 표현하면 아래 식
# movie_title = movie_tr_one.a['title'] 

movie_point = movie_tr_one.select_one('td.point').text
print(movie_title, movie_point)
가버나움 9.59
In [46]:
# 반복해서 전체 가져오기

movie_title_point_list = []

for movie_tr_one in movie_tr_all:
    movie_title = movie_tr_one.select_one('a[title]')
    movie_point = movie_tr_one.select_one('td.point')

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

*날짜 함수 사용하기

  • 날짜를 str 에서 obj로 변환시켜 줌
  • datetime
  • strftime('%Y%m%d') : 날짜함수로 str->obj 된 날짜를 다시 str으로 변환
In [72]:
# 날짜 함수 사용법
now = datetime.datetime.now()
print(now)

tommorrow = now + datetime.timedelta(days=1)
print(tommorrow)
print(type(tommorrow)) # <class 'datetime.datetime'> obj임!

yesterday = now + datetime.timedelta(days=-1)
print(yesterday.strftime('%Y%m%d') ) # 20200604(str)
2020-06-05 11:16:42.351845
2020-06-06 11:16:42.351845
<class 'datetime.datetime'>
20200604

날짜 함수 네이버 영화에 적용

In [69]:
def get_date(day):
    now = datetime.datetime.now()
    ret_date = now + datetime.timedelta(days=day)
    return ret_date.strftime('%Y%m%d')
In [73]:
# 10일 전 날짜 가벼왓
p_date = get_date(-10) 
print(p_date)
20200526

댓글