본문 바로가기

자동화/Selenium

네이버 뉴스 기사 모든 댓글 자동화로 추출하여 엑셀로 저장하기

728x90

네이버 랭킹 뉴스를 들어가서 일부 기사의 댓글을 보는 경우 댓글 수가 너무 많아서 한번에 확인하기 어려운 경우가 있습니다.

네이버뉴스 기사의 모든 댓글을 확인할 수 있게 자동화하여 엑셀로 저장하는 코드를 작성해보았습니다.

 

댓글 수가 몇백개가 넘는 경우 댓글을 모두 확인하기 어렵다 ㅠㅠ

 

뉴스 제목을 엑셀 시트 제목으로 저장하기 위해 추출하였습니다.

30자가 넘는 경우 경고 알림이 뜨기 때문에 30자 넘는 경우에는 30자에서 자른 후에 엑셀에 저장할 수 있도록 코드를 구현하였습니다.

 

# 뉴스 제목
news_title = driver.find_element(By.ID, 'title_area').text

# 제목이 너무 긴 경우 30자로 제한
if len(news_title) > 30:
    news_title = news_title[:30]

# 시트 타이틀 설정
ws.title = news_title

 

추출하기 위한 댓글, 공감, 비공감수를 find_elements로 모두 찾은 후 반복문을 통해 엑셀에 데이터를 저장합니다.

 

# 댓글, 공감, 비공감수 find_elements로 찾기
elements = driver.find_elements(By.CLASS_NAME, 'u_cbox_contents')
goods = driver.find_elements(By.CLASS_NAME, 'u_cbox_cnt_recomm')
bads = driver.find_elements(By.CLASS_NAME, 'u_cbox_cnt_unrecomm')

 

번호의 경우 엑셀에 저장하는 숫자를 1부터 체크하기 위해 count + 1로 구현하였습니다.

 

# 현재 보이는 댓글 내용 확인
for i in range(middle_count, len(elements)):
    ws.append([middle_count + count + 1, elements[i].text, int(goods[i].text), int(bads[i].text)])
    count = count + 1

 

보여지는 댓글을 모두 추출한 이후 추가 댓글이 있을 수 있기 때문에 최하단으로 스크롤을 하여 더보기 버튼이 있는지 유무를 체크합니다.

 

# 스크롤 이후 더보기 버튼이 있는지 체크 
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
displayed = driver.find_element(By.CLASS_NAME, 'u_cbox_page_more').is_displayed()
print(displayed)

 

더보기 버튼 유무를 체크한 후 더보기 버튼이 있는 경우에만 더보기 버튼을 눌러 추출할 추가 댓글을 노출합니다.

 

# 더보기 버튼이 있는 경우에만 클릭
if displayed:
    driver.find_element(By.CLASS_NAME, 'u_cbox_page_more').click()
else:
    more_display = False
    return

 

더보기 버튼을 통해 더 노출된 댓글만 추출하기 위해 중간 값을 더한 후 저장합니다.

 

# 추가로 더보기한 댓글만 추가하기 위해 중간 값 더하기
middle_count = middle_count + count
return

 

무한 반복문을 통해 함수를 반복하여 실행하면서 더보기 버튼이 없는 경우에 반복문을 종료합니다.

 

while True:
    # 함수 반복하여 댓글 크롤링
    comment_list()

    # 더보기 버튼이 없는 경우 반복문 종료
    if not more_display:
        break

 

전체 코드입니다. 해당 코드를 통해 많은 댓글이 있는 기사에서도 모든 댓글을 공감, 비공감 수까지 확인할 수 있습니다.

엑셀로 저장하기 때문에 데이터를 편리하게 필터링해서 확인할 수 도 있습니다.

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import time
from openpyxl import Workbook

# Workbook 생성
wb = Workbook()
# 시트 활성화
ws = wb.active

ws.append(['번호', '댓글 내용', '공감수', '비공감수'])

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

driver.get('https://n.news.naver.com/article/comment/009/0005057035')

#초기 값 설정
middle_count = 0
more_display = True

#페이지 로딩 시간이 필요해서 추가
time.sleep(3)

# 뉴스 제목
news_title = driver.find_element(By.ID, 'title_area').text

# 제목이 너무 긴 경우 30자로 제한
if len(news_title) > 30:
    news_title = news_title[:30]

# 시트 타이틀 설정
ws.title = news_title

# 댓글 수 구하기
comment_count = int(driver.find_element(By.CLASS_NAME, 'u_cbox_count').text)


# 스크롤 후 더보기 클릭 함수
def comment_list():

    # 전역 변수 사용
    global middle_count
    global more_display

    count = 0
    # 댓글, 공감, 비공감수 find_elements로 찾기
    elements = driver.find_elements(By.CLASS_NAME, 'u_cbox_contents')
    goods = driver.find_elements(By.CLASS_NAME, 'u_cbox_cnt_recomm')
    bads = driver.find_elements(By.CLASS_NAME, 'u_cbox_cnt_unrecomm')

    # 현재 보이는 댓글 내용 확인
    for i in range(middle_count, len(elements)):
        ws.append([middle_count + count + 1, elements[i].text, int(goods[i].text), int(bads[i].text)])
        count = count + 1

    # 스크롤 이후 더보기 버튼이 있는지 체크
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    displayed = driver.find_element(By.CLASS_NAME, 'u_cbox_page_more').is_displayed()
    print(displayed)

    # 더보기 버튼이 있는 경우에만 클릭
    if displayed:
        driver.find_element(By.CLASS_NAME, 'u_cbox_page_more').click()
    else:
        more_display = False
        return

    time.sleep(3)

    # 추가로 더보기한 댓글만 추가하기 위해 중간 값 더하기
    middle_count = middle_count + count
    return


while True:
    # 함수 반복하여 댓글 크롤링
    comment_list()

    # 더보기 버튼이 없는 경우 반복문 종료
    if not more_display:
        break

# 데이터 엑셀 저장
wb.save('/Users/user/Desktop/comments.xlsx')

driver.close()
728x90