글 개요
https://yoo-young.tistory.com/31
이전에 작성했던 파이썬 크롤링 기초문법을 활용한 네이버 영화평점 데이터를 수집하고 데이터를 저장해보겠습니다.
글 본문
웹 페이지는 주소에는 많은 정보가 담겨있습니다. 원하는 정보를 얻기위해서 변화시켜줘야 하는 주소 규칙을 찾을 수 있습니다. 네이버 영화평점 사이트에는 날짜 정보를 변화시켜주면 해당 페이지에 접근이 가능하고, 해당 날짜에 영화와 영화평점을 볼 수 있습니다.
네이버 영화평점사이트 크롤링에 필요한 라이브러리를 불러오겠습니다.
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 |
댓글