본문 바로가기

PYTHON

[selenium] 네이버 밴드 게시글 댓글 크롤링.

반응형

활동하고 있는 밴드에서는 게시글에 댓글로 질문을 받고 이에 대한 답변을 해준다.

꽤 유용한 정보가 많아 자주 들여다보게 되는데 게시판 형태에 익숙한 나는 이전 글 찾기가 너무 어렵다.

태그라는 훌륭한 기능이 있지만 사용 잘 안 하게 되더라.

 

그래서 이 불편함을 해소하고자 댓글 크롤링하는 것 만들어서 엑셀에 담아버렸다.

프로그램 로직은 매우 간단하다.

 

1. 셀레니엄으로 게시글에 방문한다.

2. 댓글 부분에 "첫 댓글로" 버튼이 있는지 확인한 후 있으면 클릭해준다.

3. "다음 댓글 보기" 버튼이 있는지 확인 한 후 클릭해 준다.

4. "다음 댓글 보기" 버튼이 안 나올 때 까지 3번을 반복한다.

5. 댓글을 엑셀에 복사한다.

4. 댓글에 대한 답글을 복사한다.

5. 답글이 많은 경우 " x개의 답글 더보기" 버튼이 보이는 이 버튼을 눌러 준 후 답글을 엑셀에 복사한다.

6. 복사 다 했으면 종료.

 

기본 기능에 충실한 콘솔 프로그램 완성! 

 

from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import subprocess
from time import sleep
import xlsxwriter
import win32com.client as win32
from selenium.common.exceptions import (
    NoSuchElementException,
)


options = webdriver.ChromeOptions()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

# 디버거 크롬 구동
subprocess.Popen(
    r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\chrometemp"'
)


browser = webdriver.Chrome(ChromeDriverManager().install(), options=options)

browser.set_window_size(1200, 1200)

browser.get("밴드 게시글 주소")

sleep(5)

try:
    browser.find_element(By.XPATH, "//button[@class='goFirstComment']").click()
except NoSuchElementException:
    print("")

sleep(1)

while True:
    try:
        btn = browser.find_element(By.XPATH, "//button[@class='moreView']")
        btn.click()
        sleep(1)
    except NoSuchElementException:
        break


cComment = browser.find_elements(By.XPATH, "//div[@class='cComment']")

cComment_count = len(cComment)

file_name = "제목.xlsx"

workbook = xlsxwriter.Workbook(file_name)
worksheet = workbook.add_worksheet()
cell_format = workbook.add_format()
cell_format.set_text_wrap()

row = 0

for comment in cComment:
    writeInfo = comment.find_element(
        By.XPATH, ".//div[contains(@class, 'writeInfo')]//strong[@class='name']"
    )
    print(writeInfo.text)
    commentBody = comment.find_element(
        By.XPATH, ".//p[contains(@class, '_commentContent')]"
    )
    print(commentBody.text)

    # 답글 더보기
    try:
        more_reply_btn = comment.find_element(
            By.XPATH, ".//button[@class='moreReply _openReplyListBtn']"
        )

        browser.execute_script("arguments[0].scrollIntoView(false);", more_reply_btn)

        more_reply_btn.click()
        sleep(2)
    except NoSuchElementException:
        print("")

    commentSimple = comment.find_elements(
        # By.XPATH, ".//div[contains(@class, '-commentSimple')]"
        By.XPATH,
        "./div[2]//div[@class = 'cComment' or @class = 'cComment -commentSimple']",
    )

    print("")

    worksheet.write(row, 0, commentBody.text, cell_format)

    for reply in commentSimple:
        writeInfo2 = reply.find_element(
            By.XPATH, ".//div[contains(@class, 'writeInfo')]//strong[@class='name']"
        )
        print(writeInfo2.text)
        commentBody2 = reply.find_element(
            By.XPATH, ".//p[contains(@class, '_commentContent')]"
        )
        print(commentBody2.text)

        worksheet.write(
            row, 1, writeInfo2.text + "\r\n" + commentBody2.text, cell_format
        )
        row = row + 1

    row = row + 1
    print("")
    print("")

workbook.close()
browser.quit()

excel = win32.gencache.EnsureDispatch("Excel.Application")
wb = excel.Workbooks.Open("엑셀파일 저장 경로" + file_name)
ws = wb.Worksheets("Sheet1")
ws.Columns.AutoFit()
wb.Save()
excel.Application.Quit()

 

반응형