유튜브 URL로 댓글 목록 크롤링하기
지난 포스팅에서 학습한 것을 응용하여 바로 실습을 해보도록 하겠습니다.
사용자가 유튜브 영상 URL을 입력하면, 해당 영상 댓글들의 닉네임 / 댓글 내용 / 좋아요 수 / 작성 시간대를 가져와서 출력하는 프로그램을 만들어 볼 것 입니다.
(결과 미리보기) 아래는 노마드 코더님의 유튜브 영상 중 일부 댓글입니다.
먼저, 크롤링을 위해 필요한 라이브러리를 정의합니다. (해당 라이브러리가 없다면 pip install 명령어로 설치)
pip install selenium webdriver_manager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time
먼저, 댓글을 불러오고 싶은 유튜브 URL을 input 함수로 입력받습니다.
Selenium을 사용하려면 크롬 드라이버를 설치해야 하기 때문에 여러 옵션들을 설정하고, webdriver_manager를 통해 자동으로 크롬 드라이버를 설치하고 실행합니다.
url = input("유튜브 영상 URL을 입력하세요: ")
# 크롬 드라이버 실행
service = Service(ChromeDriverManager().install())
options = webdriver.ChromeOptions()
options.add_argument("--headless") # 브라우저 창 없이 실행
options.add_argument("--disable-gpu") # GPU 가속 비활성화 (에러 방지)
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-webgl") # WebGL 오류 방지
driver = webdriver.Chrome(service=service, options=options)
driver.get(url)
time.sleep(5) # 페이지 로딩 대기
유튜브 댓글은 페이지 로딩 후 동적으로 로드되기 때문에, 스크롤을 끝까지 내려서 모든 댓글을 가져와야 합니다. 이를 위해 JavaScript를 사용하여 스크롤을 아래로 내리는 작업을 반복합니다. 스크롤을 내리면서 페이지가 더 이상 로드되지 않으면 반복문을 빠져나오도록 해줍니다. 그리고, 댓글 요소가 로드될 때까지 최대 10초 동안 기다리고, 예외가 발생하면 프로그램을 종료합니다.
# 스크롤을 끝까지 내려서 모든 댓글을 로드
scroll_pause_time = 2
last_height = driver.execute_script("return document.documentElement.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")
time.sleep(scroll_pause_time)
new_height = driver.execute_script("return document.documentElement.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# 댓글 요소가 로드될 때까지 최대 10초 대기
try:
WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.XPATH, '//ytd-comment-thread-renderer'))
)
except Exception as e:
print("댓글을 찾을 수 없습니다. 다시 시도해주세요. 오류: {e}")
driver.quit()
exit()
댓글이 모두 로드되면, XPath를 사용하여 댓글 내용을 추출합니다. 유튜브 댓글은 여러 요소로 구성되어 있기 때문에, 각 요소를 찾기 위해 XPath를 사용하여 접근합니다. 각 댓글의 닉네임, 댓글 내용, 좋아요 수, 작성 시간을 추출하여 콘솔에 출력합니다.
# 댓글 요소 가져오기
comments = driver.find_elements(By.XPATH, '//ytd-comment-thread-renderer')
# 댓글 출력
print("\n@@@유튜브 댓글 가져오기@@@\n")
if comments:
for idx, comment in enumerate(comments):
# 닉네임
try:
nickname = comment.find_element(By.XPATH, './/span[@class=" style-scope ytd-comment-view-model style-scope ytd-comment-view-model"]').text
except:
nickname = "닉네임을 찾을 수 없습니다."
# 댓글 내용
try:
comment_text = comment.find_element(By.XPATH, './/span[@class="yt-core-attributed-string yt-core-attributed-string--white-space-pre-wrap"]').text
except:
comment_text = "댓글을 찾을 수 없습니다."
# 좋아요 수
try:
likes = comment.find_element(By.XPATH, './/span[@id="vote-count-middle"]').text
if not likes: # 좋아요가 비어 있을 경우 처리
likes = "0"
except:
likes = "0" # 좋아요가 없을 경우 기본 값
# 작성 시간대
try:
timestamp = comment.find_element(By.XPATH, './/span[@id="published-time-text"]//a').text
except:
timestamp = "시간을 찾을 수 없습니다."
print(f"\n댓글 {idx + 1}번>")
print(f"닉네임: {nickname}")
print(f"댓글 내용: {comment_text}")
print(f"좋아요 수: {likes}")
print(f"작성 시간대: {timestamp}")
else:
print("댓글이 존재하지 않습니다.")
# 웹드라이버 종료
driver.quit()
comment.find_element()에 들어가는 XPath 경로를 알아내는 방법!
먼저, 크롤링 할 사이트에 접속하여 F12를 눌러서 개발자 도구(DevTools)를 열어줍니다. 요소(Elements) 탭을 클릭하고, 추출하고자 하는 텍스트 위에서 마우스 우클릭 -> 검사(Inspect) 선택하면 해당 텍스트의 HTML 코드가 개발자 도구에 나타납니다. 그럼 HTML 요소에 class나 id 속성을 복사하여 추가하면 됩니다.
전체 코드
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time
url = input("유튜브 영상 URL을 입력하세요: ")
# 크롬 드라이버 실행
service = Service(ChromeDriverManager().install())
options = webdriver.ChromeOptions()
options.add_argument("--headless") # 브라우저 창 없이 실행
options.add_argument("--disable-gpu") # GPU 가속 비활성화 (에러 방지)
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-webgl") # WebGL 오류 방지
driver = webdriver.Chrome(service=service, options=options)
driver.get(url)
time.sleep(5) # 페이지 로딩 대기
# 스크롤을 끝까지 내려서 모든 댓글을 로드
scroll_pause_time = 2
last_height = driver.execute_script("return document.documentElement.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")
time.sleep(scroll_pause_time)
new_height = driver.execute_script("return document.documentElement.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# 댓글 요소가 로드될 때까지 최대 10초 대기
try:
WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.XPATH, '//ytd-comment-thread-renderer'))
)
except Exception as e:
print("댓글을 찾을 수 없습니다. 다시 시도해주세요. 오류: {e}")
driver.quit()
exit()
# 댓글 요소 가져오기
comments = driver.find_elements(By.XPATH, '//ytd-comment-thread-renderer')
# 댓글 출력
print("\n@@@유튜브 댓글 가져오기@@@\n")
if comments:
for idx, comment in enumerate(comments):
# 닉네임
try:
nickname = comment.find_element(By.XPATH, './/span[@class=" style-scope ytd-comment-view-model style-scope ytd-comment-view-model"]').text
except:
nickname = "닉네임을 찾을 수 없습니다."
# 댓글 내용
try:
comment_text = comment.find_element(By.XPATH, './/span[@class="yt-core-attributed-string yt-core-attributed-string--white-space-pre-wrap"]').text
except:
comment_text = "댓글을 찾을 수 없습니다."
# 좋아요 수
try:
likes = comment.find_element(By.XPATH, './/span[@id="vote-count-middle"]').text
if not likes: # 좋아요가 비어 있을 경우 처리
likes = "0"
except:
likes = "0" # 좋아요가 없을 경우 기본 값
# 작성 시간대
try:
timestamp = comment.find_element(By.XPATH, './/span[@id="published-time-text"]//a').text
except:
timestamp = "시간을 찾을 수 없습니다."
print(f"\n댓글 {idx + 1}번>")
print(f"닉네임: {nickname}")
print(f"댓글 내용: {comment_text}")
print(f"좋아요 수: {likes}")
print(f"작성 시간대: {timestamp}")
else:
print("댓글이 존재하지 않습니다.")
# 웹드라이버 종료
driver.quit()
이번 실습을 통해 Selenium을 활용한 유튜브 댓글 크롤링을 직접 경험해 보았습니다.
실제로 개발자 도구를 활용해 원하는 데이터를 찾고, XPath를 이용해 추출하는 과정이 정말 재밌었습니다.
앞으로는 더 다양한 사이트에서 크롤링을 시도하고, 수집한 데이터를 분석하는 프로젝트를 진행해보는 것도 흥미로울 것 같네요. 크롤링 너무 재밌다!