pbj0812의 코딩 일기

[자동화] python을 이용한 유투브 라이브 채널의 정보 및 댓글 크롤링 본문

빅데이터/자동화

[자동화] python을 이용한 유투브 라이브 채널의 정보 및 댓글 크롤링

pbj0812 2020. 5. 31. 21:43

pytchat 이 업그레이드 됨에 따라 문서를 따라하여 만들었으니 혹시 라이브 크롤링이 안되시는 분은  링크 참고 부탁드리겠습니다.

0. 목표

 - python을 이용하여 아래 라이브 채널의 댓글 및 채널의 정보 획득

1. flow chart

   - 유투브 라이브 채널을 파이썬을 이용하여 정보 및 실시간 댓글을 모으고 실시간으로 csv 파일로 저장하는 형태

2. 문제

 - 원하는 정보(실시간 시작일, 채널 명)가 태그 사이가 아닌 스크립트 안에 끼어져 있는 형태

3. 준비

 1) library 설치

  - pytchat : 실시간 댓글 크롤링 라이브러리

  - youtube-dl : pafy 실행을 위해 필요

  - pafy : 유투브 정보 긁어 오기

  - pafy의 경우 특정 정보(스트리밍 시작일 등)를 얻기 위해서는 youtube api가 필요

pip install youtube-dl
pip install pafy
pip install pytchat

 2) youtue api 설정

  (1) console.developers.google.com/apis/ 접속

   - 새 프로젝트 생성

   - 라이브러리 클릭

  (2) youtube 검색

   - YouTube Data API v3 클릭

   - 사용설정 클릭

  (3) 사용자 인증 정보 클릭

   - 사용자 인증 정보 만들기 클릭

   - API 키 클릭

4. 코드 작성

 1) library 호출

from pytchat import LiveChat
import pafy
import pandas as pd

 2) api 설정

  - 위 준비 단계에서 얻은 api-key 입력

pafy.set_api_key('api-key 입력')

 3) 대상 유투브 라이브 방송의 video_id 지정

  ex) www.youtube.com/watch?v=VykycecFVoc 라면 VykycecFVoc가 video_id

video_id = '비디오 아이디'

 4) 라이브 방송 정보 획득

v = pafy.new(video_id)
title = v.title
author = v.author
published = v.published

print(title)
print(author)
print(published)

  - 결과

[1회부터 120회까지 사골 스트리밍] 2020에도 맛있는 녀석들  [맛있는 녀석들_Tasty Guys]
맛있는 녀석들 (Tasty Guys)
2020-05-29 13:27:59Z

 5) 빈 csv 생성

empty_frame = pd.DataFrame(columns=['제목', '채널 명', '스트리밍 시작 시간', '댓글 작성자', '댓글 내용', '댓글 작성 시간'])
empty_frame.to_csv('./youtube.csv')

  - 결과

 6) 크롤링 및 결과 csv 추가

  - 위에서 빈 프레임으로 제목을 미리 저장했으므로, 실시간으로 정보를 얻은 뒤 헤더를 제외하고 어펜드 하는 형식

chat = LiveChat(video_id = video_id, topchat_only = 'FALSE')

while chat.is_alive():
    try:
        data = chat.get()
        items = data.items
        for c in items:
            print(f"{c.datetime} [{c.author.name}]- {c.message}")
            data.tick()
            data2 = {'제목' : [title], '채널 명' : [author], '스트리밍 시작 시간' : [published], '댓글 작성자' : [c.author.name], '댓글 내용' : [c.datetime], '댓글 작성 시간' : [c.message]}
            result = pd.DataFrame(data2)
            result.to_csv('youtube.csv', mode='a', header=False)
    except KeyboardInterrupt:
        chat.terminate()
        break

5. 결과

6. 참고

 - csv append 관련

 - dataframe 생성

 - pytchat

 - pafy

Comments