네이버 영화/드라마 시놉시스 크롤링
4416개 넷플릭스 시놉시스를 크롤링했다. 이제 이 영화/드라마의 네이버에서의 시놉시스를 크롤링하면 된다.
네이버 영화 API가 있어서 이걸로 수집하면 된다는데 모르겠다.. 그래서 그냥 하던대로 했다.
우선 네이버에 드라마/영화 제목을 검색하면 (당연히) 시놉시스가 다른 태그에 들어있어서 둘을 나눠서 수집해야 한다.
드라마는 검색한 페이지에 바로 전체 시놉시스가 뜬다.
검색 페이지에선 ... 가 있어서 전체 시놉시스가 안 보이는 듯하지만, 페이지 소스에는 전체 시놉시스가 들어있다! 전체 시놉시스가 들어있는 태그의 id는 "layer_sy"
근데 영화는 아님.
영화는 페이지 소스를 열어봐도 ... 밖에 없다. 전체 시놉시스는 더보기에 연결된 링크로 가야 확인할 수 있다. 더보기 링크가 있는 태그의 class는 "cont_more"
더보기를 클릭하면 뜨는 새로운 페이지.
여기서 전체 시놉시스가 있는 p 태그의 class는 "con_tx"다.
일단 쉬운 드라마부터 하자!
우선 저번 넷플릭스 크롤링에서 수집한 드라마 제목의 리스트가 필요하다. 넷플릭스 파일을 불러와서 드라마만 있는 df를 만들어준다.
import pandas as pd
df = pd.read_csv('movie_project.csv')
drama = df[df["genre"]=='드라마']
그리고 검색어를 이용해 크롤링한다. 네이버에 '비밀의 숲'이라고 검색하면 다음과 같은 주소가 만들어진다.
* search.naver.com/어쩌구저쩌구&query=[검색어]
근데 이 주소를 복붙해보면 한글로 '비밀의+숲' 이렇게 나오는게 아니라
알 수 없는 문자로 변한다. 얘네 이름이 뭐였지!!! 수업시간에 들어본 거 같기도 한데 기억이 안난다.
어쨌든 이렇게 괴상한 문자로 바꿔준 url을 줘야 크롤링이 가능하다. 이걸 어떻게 바꾸는지 구글링 하느라 넘 힘들었다.
쨌든 quote 뭐시기를 이용하면 된다.
quote(비밀의+숲) = %EB%B9%84%EB%B0%80%EC%9D%98+%EC%88%B2
# 네이버 드라마 시놉시스를 저장할 새로운 df
df2 = pd.DataFrame(columns=["title", "naver"])
count=0
from urllib.parse import quote
from urllib.request import urlopen
for title in drama['title']:
url = "https://search.naver.com/search.naver?sm=top_hty&fbm=1&ie=utf8&query="+quote(title)
with urllib.request.urlopen(url) as url:
try:
doc = url.read()
soup = BeautifulSoup(doc, "html.parser")
naver = soup.find_all(id="layer_sy")[0].text.strip()
df2.loc[count] = [title, naver]
count+=1
except:
pass
그럼 이런 df2 완성~!
이제 좀 번거로운 영화. 영화는 for문을 두 번 돌려야 한다. 우선 드라마와 마찬가지로 넷플릭스에서 수집한 영화 이름을 for문으로 돌려 네이버 검색 페이지를 받는다. 그 페이지에서 더보기에 연결된 url을 리스트로 저장한다. 이 더보기 url을 다시 for문으로 돌려서 전체 시놉시스를 저장한다.
from urllib.parse import quote
from urllib.request import urlopen
# 더보기 url을 저장할 리스트
movie_url=[]
for title in movie['title']:
url = "https://search.naver.com/search.naver?sm=top_hty&fbm=1&ie=utf8&query="+quote(title)
with urllib.request.urlopen(url) as url:
try:
doc = url.read()
soup = BeautifulSoup(doc, "html.parser")
link = soup.find_all(class_="cont_more")[0]['href']
movie_url.append(link)
except:
pass
그럼 movie_url은 이런 리스트가 된다.
# 네이버 영화 시놉시스를 저장할 df 만들기
df3 = pd.DataFrame(columns=["title", "naver"])
count=0
for url in movie_url:
try:
with urllib.request.urlopen(url) as url:
doc = url.read()
soup = BeautifulSoup(doc, "html.parser")
title = soup.find_all("title")[0].text.strip()[:-9]
naver = soup.find_all("p", class_="con_tx")[0].text.strip()
df3.loc[count] = [title, naver]
count+=1
except:
pass
df3도 완성!
이제 넷플릭스 + 네이버 드라마 + 네이버 영화 데이터를 합쳐주기만 하면 된다.
네이버 드라마 df에 이 작품들이 네이버 드라마임을, 네이버 영화 df에 이 작품들이 네이버 영화임을 명시하는 칼럼을 추가한다.
df2['genre'] = '드라마'
df2['media'] = 'naver'
df3['genre'] = '영화'
df3['media'] = 'naver'
그럼 df2와 df3는 이렇게 된다.
이제 df2, df3를 naver라는 이름으로 합쳐준다.
# df2, df3 합치기
naver = pd.concat([df2, df3])
# 칼럼 이름 naver에서 desc로 바꾸기
naver = naver.rename(columns={"naver": "desc"})
같은 방식으로 넷플릭스 데이터도 약간 cleaning 해주고 csv 파일로 저장하면 끝!