반응형
활동하고 있는 밴드에서는 게시글에 댓글로 질문을 받고 이에 대한 답변을 해준다.
꽤 유용한 정보가 많아 자주 들여다보게 되는데 게시판 형태에 익숙한 나는 이전 글 찾기가 너무 어렵다.
태그라는 훌륭한 기능이 있지만 사용 잘 안 하게 되더라.
그래서 이 불편함을 해소하고자 댓글 크롤링하는 것 만들어서 엑셀에 담아버렸다.
프로그램 로직은 매우 간단하다.
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()
반응형
'PYTHON' 카테고리의 다른 글
jupyter notebook 줄 바꿈. (0) | 2024.07.02 |
---|---|
jupyter notebook 자동 포맷터 설정. (0) | 2024.06.28 |
[selenium] shadowRoot 접근하는 방법 (0) | 2022.02.08 |
[pandas] y축 범위가 다른 두 그래프를 함께 그리기 (0) | 2022.01.27 |
[pandas] 그래프 x축 날짜 간격이 너무 촘촘한 경우. (0) | 2022.01.21 |