대외활동/ABC 지역주도형 청년 취업역량강화 ESG 지원산업

[ABC 220907 - 17일차(결석)] 유튜브 댓글 크롤링 및 워드 클라우드

갓생사는 공순이가 되고싶은 콩순이 2022. 9. 11. 04:19
반응형

유튜브 댓글 크롤링 및 워드 클라우드

# 이날 결석해서 팀원분께 코드 받아서 혼자 프로그래밍 진행 후 정리한 자료입니다.

라이브러리 설치

!pip install selenium
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin

한글 깨짐 방지

import matplotlib as mpl
import matplotlib.pyplot as plt
 
%config InlineBackend.figure_format = 'retina'
 
!apt -qq -y install fonts-nanum
 
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic') 
mpl.font_manager._rebuild()

라이브러리 임포트

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time

import pandas as pd

import warnings
warnings.filterwarnings('ignore')

유튜브 댓글 크롤링

# https://youtu.be/QXsgwMjF_z4

# 웹 드라이버 셋팅
options = webdriver.ChromeOptions()
options.add_argument('--headless') # Head-less 설정
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

# 웹 드라이버
driver = webdriver.Chrome('chromedriver', options=options)

driver.get('https://youtu.be/QXsgwMjF_z4')
driver.implicitly_wait(3)

time.sleep(1.5)

driver.execute_script('window.scrollTo(0,800)')
time.sleep(3)

# 댓글 수집을 위한 스크롤 내리기

# 최초 접속 시 스크롤 높이 초기화
last_height = driver.execute_script('return document.documentElement.scrollHeight')

while True :
  driver.execute_script('window.scrollTo(0, document.documentElement.scrollHeight);')
  time.sleep(1.5)

  new_height = driver.execute_script('return document.documentElement.scrollHeight')

  if new_height == last_height :
    break
  
  last_height = new_height
  time.sleep(1.5)

  try : 
    driver.find_element_by_css_seletor('#dismiss-button > a').click # 크롤링 중 유튜브 한달 무료 팝업 닫기
    time.sleep(1.5)

  except :
    pass

  # 댓글 크롤링

html_source = driver.page_source
soup = BeautifulSoup(html_source, 'html.parser')

id_list = soup.select('div#header-author > h3 > #author-text > span')
comment_list = soup.select('yt-formatted-string#content-text')

id_final = []
comment_final = []

for i in range(len(comment_list)):
  temp_id = id_list[i].text
  temp_id = temp_id.replace('\n', '').replace('\t', '').replace(' ', '').strip()
  id_final.append(temp_id) # 댓글 작성자

  temp_comment = comment_list[i].text
  temp_comment = temp_comment.replace('\n', '').replace('\t', '').replace('\r', '').strip()
  comment_final.append(temp_comment) # 댓글 내용

# DataFrame 만들기 (list -> dic -> dataframe)

youtube_dic = {'아이디':id_final, '댓글내용':comment_final}
youtube_pd = pd.DataFrame(youtube_dic)

youtube_pd.head()

youtube_pd.info()

크롤링 데이터 저장

youtube_pd.to_csv('유튜브댓글_크롤링_20220907.csv', encoding='utf-8-sig', index=False)

워드클라우드 시각화

df = pd.read_csv('/content/유튜브댓글_크롤링_20220907.csv')
df.info()

df.head(20)

데이터 전처리

text = ''.join(li for li in df['댓글내용'].astype(str))
text

워드 클라우드 시각화

import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

plt.subplots(figsize=(25, 15))
wordcloud = WordCloud(background_color='white', width=1000, height=700, font_path=fontpath).generate(text)
plt.axis('off')
plt.imshow(wordcloud, interpolation='bilinear')
plt.show()

LIST