본문 바로가기
프로젝트(홀딩)/유튜브 댓글분석

[댓심]댓글 크롤링 프로그램 제작1 : 코드 완성

by 일말고프로젝트 2021. 4. 7.
from selenium import webdriver as wd
from bs4 import BeautifulSoup
import time
import re
import pandas as pd


driver = wd.Chrome(executable_path="C:/Users/MSI/OneDrive/바탕 화면/youtube/chromedriver.exe")
url = 'https://www.youtube.com/watch?v=yDD4K-XxuDY'
driver.get(url)


last_page_height = driver.execute_script("return document.documentElement.scrollHeight")

while True: 
    driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")
    time.sleep(5.0)
    new_page_height = driver.execute_script("return document.documentElement.scrollHeight")
    if new_page_height == last_page_height:
        break
    else:
        last_page_height = new_page_height

source = driver.page_source

        

soup = BeautifulSoup(source, 'lxml')

user_id = soup.select("div#header-author > h3 > a > span")
comments = soup.select("yt-formatted-string#content-text")
likes = soup.select("#vote-count-middle")

ids = []
com = []
like = []

for i in range(len(user_id)):
    ids_temp = str(user_id[i].text)
    ids_temp = ids_temp.replace('\n', '')
    ids_temp = ids_temp.replace('            ', '')
    ids_temp = ids_temp.replace('              ', '')
    ids_temp = ids_temp.replace('  ', '')
    ids.append(ids_temp)
    
    com_temp = comments[i].text
    com_temp = com_temp.replace('\n', '')
    com.append(com_temp)
    
    likes_temp = str(likes[i].text)
    likes_temp = likes_temp.replace('\n', '')
    likes_temp = likes_temp.replace('    ', '')
    likes_temp = likes_temp.replace('  ', '')
    like.append(int(likes_temp))

crawling_data = pd.DataFrame({'ID': ids
                            ,'Comment': com
                            ,'LIKE': like})

crawling_data

 

총 댓글이 678개인데 크롤링 결과는 346개 밖에 크롤링 되지 않았다...

 

 

아마도 이 부분에서 문제가 생긴 듯 하다.

while True: 
    driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")
    time.sleep(5.0)
    new_page_height = driver.execute_script("return document.documentElement.scrollHeight")
    if new_page_height == last_page_height:
        break
    else:
        last_page_height = new_page_height

 

스크롤을 내리고 페이지 마지막까지 내리는 방법을 다시 알아보고 코드를 수정해봐야겠다. 또한, time.sleep을 써서 로딩 시간을 감안하고 있는데, 댓글이 몇 만개가 달리는 영상의 경우 로드가 너무 심할 것 같다. 근본적으로 다른 접근법을 찾아봐야겠다.

 

1. 스크롤 내리는 방법 다시 찾기

2. 전체 댓글 파싱 다른 접근법 찾기

 


여러 방법을 찾아봤지만 결과가 같았다.. 그러다 우연찮게 발견한 댓글에서 힌트를 찾았다.

 

https://somjang.tistory.com/entry/PythonSelenium%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EB%8C%93%EA%B8%80-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0

 

 

확인해 보니 대댓글 수가 산정되어 총 댓글 수가 상단에 노출되지만 내가 제작한 크롤링 프로그램에서는 대댓글을 수집하지 않아 갯수에 차이가 보이는 듯 하다. 대댓글을 크롤링 해야하는지, 또 크롤링 한다면 어떤 정보가 필요한지에 대한 판단이 필요한 상황이다.

 

처음 가져갔던 의문 세 가지인

 

채널 내에서 상대적으로 댓글 수가 많은 영상은 어떤 영상일까?
구독자들은 무슨 이야기를 하고 있을까?
유튜버는 구독자들의 이야기를 잘 반영하고 있을까?

 

를 풀어내는 데 대댓글 데이터는 필요하다. 1번 질문에서 대댓글의 수도 산정되어야 하고, 2번 질문에서 구독자들이 서로 무슨 이야기를 하고 있는지 파악하기 위해 필요하기 때문에 필요한 정보이다. 그러므로, 대댓글의 수와 댓글 내용을 추가로 크롤링하도록 수정을 진행한다.

 

또한, 대댓글이 달린 댓글과의 연관성을 파악하기 위해선 어떤 댓글의 대댓글인지와 대댓글 작성자와 댓글 작성자와의 대화로 인식할 수 있도록 아이디도 필요하다. 추가적으로 가능하다면 유튜버의 댓글 참여도 확인하면 좋을것 같다..

 

1. 댓글, 대댓글 연관되어서 마이닝하기

2. 유튜버 댓글 식별하기 -> 추가 표시 필요

3. 대댓글 작성자, 좋아요 수 정보 크롤링 필요

 

댓글