nlp

네이버 영화/드라마 시놉시스 크롤링

codlingual 2019. 10. 8. 21:57
반응형

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=[검색어] 

 

근데 이 주소를 복붙해보면  한글로 '비밀의+숲' 이렇게 나오는게 아니라

 

https://search.naver.com/search.naver?sm=top_hty&fbm=1&ie=utf8&query=%EB%B9%84%EB%B0%80%EC%9D%98+%EC%88%B2

 

알 수 없는 문자로 변한다. 얘네 이름이 뭐였지!!! 수업시간에 들어본 거 같기도 한데 기억이 안난다. 

어쨌든 이렇게 괴상한 문자로 바꿔준 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 파일로 저장하면 끝!

 

반응형