Data Engineering/Crawling

[Crawling] 네이버 영화 평점 및 댓글 크롤링

YSY^ 2020. 8. 5. 19:02

이번 포스팅에서는 네이버 영화 리뷰 및 평점을 크롤링해보겠습니다.

https://movie.naver.com/movie/point/af/list.nhn

 

평점 : 네이버 영화

네티즌 평점과 리뷰 정보 제공

movie.naver.com

네이버 영화평점

개요

  • https://movie.naver.com/ 로 이동
  • 평점/리뷰 메뉴 클릭
  • 영화제목, 영화링크, 평점, 댓글을 크롤링한다.

요청방식

항목

  • base : table.list_netizen > tbody > tr > td.title : 이 td들 안에 다 있다.
  • 영화제목 : > a.movie : text
    • href속성은 그 영화의 댓글만 모아놓은 url( 상대경로로 href="?st=mcode&sword=185917&target=after" 형식으로 쿼리 스트링만 있다.)
  • 평점
    • div.list_netizen_score > em 의 text

  • 댓글
    • br의 next_sibling
    • text조회하면 안의 하위 태그들의 text도 조회된다.
      • br을 찾은 뒤 그 다음 노드로 찾는다.
        • tag.next_sibling : 텍스트 노드까지 포함 해서 다음 노드를 반환한다.
          • br다음의 text node를 조회할 것이므로 next_sibling 사용
        • tag.next_element : 다음 element node 반환

1페이지 조회

import requests
from urllib import parse
from bs4 import BeautifulSoup
base_url = 'https://movie.naver.com/movie/point/af/list.nhn?&page={}'
url = base_url.format(1)
res=requests.get(url)

if res.status_code == 200:
    soup = BeautifulSoup(res.text)
    tds = soup.select('table.list_netizen > tbody > tr > td.title')
    print(len(tds))
    for td in tds:
        movie_title = td.select_one('a.movie').text.strip()
        link = td.select_one('a.movie').get('href')
        link = parse.urljoin(base_url, link)
        score = td.select_one('div.list_netizen_score > em').text.strip()
        comment = td.select_one('br').next_sibling.strip() #textnode 인 경우 text 로 조회할 필요 없다.
        print(movie_title, link, score, comment, sep=' :: ')
        print('-------------------------------------------------')

#결과

 

전체 페이지 조회

페이지를 바로바로 넘기면 크롤링이 안될수 있을 뿐만 아니라 네이버측에서 크롤링을 막을 수 있기 때문에 Delay를 걸어주어야 한다.

import random
random.uniform(0.2, 1.2) #이 사이의 실수를 동일한 확률로 나오게 한다.
import requests
import time
import random
from bs4 import BeautifulSoup


base_url = 'https://movie.naver.com/movie/point/af/list.nhn?&page={}'
#결과 저장할 리스트
comment_list = []
for page in range(1, 101):
    url = base_url.format(page)
    res=requests.get(url)
    if res.status_code == 200:
        soup = BeautifulSoup(res.text, 'lxml')
        tds = soup.select('table.list_netizen > tbody > tr > td.title')
        for td in tds:
            movie_title = td.select_one('a.movie').text.strip()
            link = td.select_one('a.movie').get('href')
            link = parse.urljoin(base_url, link)
            score = td.select_one('div.list_netizen_score > em').text.strip()
            comment = td.select_one('br').next_sibling.strip()
            # 리스트에 저장
            comment_list.append((movie_title, link, score, comment))
        interval = round(random.uniform(0.2, 1.2), 2)
        time.sleep(interval)
print('종료') 

저장

import pandas as pd
df = pd.DataFrame(comment_list, 
                  columns=['영화제목','영화링크', '평점','댓글'])
df.to_csv('naver_comment.csv', encoding='utf-8', index=False)

 

#결과

728x90
반응형