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
'자동화 > Selenium' 카테고리의 다른 글
설날 연휴 KTX 좌석 남아있는거 자동화로 확인하기 (0) | 2022.12.26 |
---|---|
네이버부동산 특정날짜 주요뉴스 목록 추출하기 (0) | 2022.12.20 |
KFC 설문조사 Selenium으로 자동화하기 (0) | 2022.12.06 |
핫딜게시판 목록 리스트 자동화하여 추출 (0) | 2022.11.08 |
과거 1달 국내주식 시가총액 순위 자동화로 추출하기 (0) | 2022.11.06 |