본문 바로가기
Python Crawing

크롤링- 기초문법 활용 네이버 영화 평점 크롤링

by 앵남(Andy) 2021. 10. 5.

글 개요 

https://yoo-young.tistory.com/31

 

크롤링 - 기초 문법

글 개요 파이썬에서 웹크롤링을 하려면 BeautifulSoup 와 Selenium 라이브러리를 사용해야 합니다. 그중 저는 BeautifulSoup라이브러리의 기초적인 문법을 정리하려고 합니다. 글 본문 BeautifulSoup()함수 from

yoo-young.tistory.com

이전에 작성했던 파이썬 크롤링 기초문법을 활용한 네이버 영화평점 데이터를 수집하고 데이터를 저장해보겠습니다. 

 

 

글 본문

웹 페이지는 주소에는 많은 정보가 담겨있습니다. 원하는 정보를 얻기위해서 변화시켜줘야 하는 주소 규칙을 찾을 수 있습니다. 네이버 영화평점 사이트에는 날짜 정보를 변화시켜주면 해당 페이지에 접근이 가능하고, 해당 날짜에 영화와 영화평점을 볼 수 있습니다. 

 

네이버 영화평점사이트 크롤링에 필요한 라이브러리를 불러오겠습니다. 

import pandas as pd 
from urllib.requests import urlopen, Request
from bs4 import BeautifulSoup

 

이제 네이버 영화평점 사이트 크롤링에 필요한 코드를 작성해보겠습니다.

url = "https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=cur&date=20210914"
response = urlopen(url) # response.status # 200 넘어오는지 학인

soup = BeautifulSoup(response, 'html.parser')
print(soup.prettify())

url 변수에 있는 문자열에 맨 끝을 보면 날짜가 있습니다. 이 날짜만 수정을 해주면 해당날짜에 있는 영화 제목과 해당영화 평점을 크롤링을 할 수 있습니다. 

 

영화 제목 태그찾기

이제 우리가 원하는 데이터는 영화 제목과 영화 평점입니다. 크롬 개발자도구에서 영화제목이 어떤 태그를 가지고 있는지 확인을 해봅시다. 

태그

태그는 div이고 class명은 tit5에 영화제목이 있는걸 확인할 수 있습니다. 패턴을 확인해보니 div 태그고 class는 tit5인것을 다 가져오면 영화제목을 가져올 수 있을거 같습니다.

# 방식 1
soup.find_all('div', class_='tit5')
# 방식 2
soup.find_all('div', {'class':'tit5'})
#방식 3
soup.select('div.tit5')

최근에 코딩방식을 바꿔보았습니다. 항상 코드를 사용할때 이방식 말고 다른방식으로 할 수 있지않을까? 먼저 생각을 해보고 방식이 있는지 생각을 해보는 습관을 가질려고 노력하고 있습니다. 그래서 태그는 div이고 class명은 tit5인 태그들을 다 가져오는 방법이 3가지 방식이 있습니다. 

select에서는 .이 class_ 표시이고 #이 id 라고 했습니다. 

 

결과

태그가 div이고 class명이 tit5인 값들이 리스트로 반환되었습니다. 자세히 보니 div태그안에 a태그가 있고 a태그안에 영화 제목이 있는걸 확인할 수 있습니다. 그러니 a태그에 먼저접근을 하고 거기에서 문자열만 추출하면 영화제목을 가져올 수 있을거 같습니다.

# 텍스트만 추출하는방법 1
soup.find_all('div', class_'tit5')[0].a.string
# 텍스트만 추출하는방법 2
soup.find_all('div', class_'tit5')[0].a.get_text()
# 텍스트만 추출하는방법 3
soup.find_all('div', class_'tit5')[0].a.text

일단, 첫 번째 데이터에 접근해서 위 방법으로 하면 영화제목으로 가져올 수 있는지 테스트를 하는 중입니다. 태그안에 있는 텍스트만 추출하는 방법은 string, get_text(), text 3가지가 있습니다. 

 

영화 평점 태그 찾기

이제 영화제목을 가져왔으니 해당영화의 평점을 가져올 수 있는 방법을 설명하겠습니다. 또한 영화평점 태그도 td라는 태그안에 class가 point인 상태로 표시되고 있습니다. 그러면, 영화제목도 위 방식처럼 접근할 수 있습니다.

soup.find_all('td', class_='point')[0].text
soup.select('td.point')[0].text

index 0을 해주는 이유는 제대로 영화 평점을 가져오는지 테스트를 하는 중입니다. 위 방식중 마음에 드는 방식으로 하시면 됩니다. 

 

이제 모든 영화 제목을 크롤링 하는방법을 설명하겠습니다. 위에서 한가지만 데이터를 가져오는 방법을 설명했는데 이제 모든 영화제목에 적용을 시켜보겠습니다. 

lastEnd = len(soup.find_all('div', class_='tit5'))

#영화제목 담을 리스트
movieList = []

# 방법 1 
for n in range(0, lastEnd):
	movieList.append(soup.find_all('div', class_='tit5')[n].string)
    
    
# 방법 2 
movieList = [soup.find_all('div', class_='tit5')[n].string for n in range(0, lastEnd)]

해당 페이지에 있는 영화 제목을 모두 가져오는 방법입니다. 방법 1 도 있고 방법 2도 존재합니다. 편한방법으로 크롤리을 하면 될거같습니다.

일부 이미지만 캡쳐

이제 각 해당하는 영화 평점을 가져오는걸 해보겠습니다. 

# 영화 평점
end = soup.find_all('td', class_='point')

movie_point = [soup.find_all('td', class_='point')[n].string for n in range(0, end)]
print(movie_point)

평점

이렇게 각 영화에 대한 평점 데이터를 가져왔습니다. 이제 전체 데이터 수를 확인해야합니다. 

print(len(movie_names), len(movie_point))

#47 47

이렇게 20210914일에 평가된 각 영화에 대한 평점과 제목을 가져왔습니다. 이제 데이터프레임을 만들고 데이터를 저장해보겠습니다.

import pandas as pd 



movie_data = pd.DataFrame({
	"영화 제목": movie_names,
    "영화 평점": movie_point
})

movie_data.to_csv("./naver movie points data.csv", sep=',', encoding='utf-8)

20210914에 해당하는 영화 제목과 해당하는 평점 데이터를 수집하고 저장하는걸 활용 해보았습니다. 

'Python Crawing' 카테고리의 다른 글

Selenium - headless 와 wait 문법 사용해보기  (0) 2021.10.12
Selenium - 기본 문법 이해하기  (3) 2021.10.12
Selenium - iframe  (0) 2021.10.12
크롤링 - 기초 문법  (0) 2021.09.29

댓글