pbj0812의 코딩 일기

[자동화] Youtube API를 이용한 게시글 전체 댓글 크롤링 본문

빅데이터/자동화

[자동화] Youtube API를 이용한 게시글 전체 댓글 크롤링

pbj0812 2020. 7. 22. 00:39

0. 목표

 - 게시글에 있는 모든 댓글의 크롤링

1. 준비

 1) 댓글 작업(102개 댓글 및 몇 개의 댓글에 대한 대댓글(3개) 작성, 총합 105개)

  * 내 유투브 영상에 댓글 작성

 2) 구글 디벨로퍼 키(API KEY) 획득

  - 링크 참조

2. 코드 작성

 1) 라이브러리 호출

from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from oauth2client.tools import argparser

 2) 파라미터 지정

DEVELOPER_KEY = "API KEY 입력"
YOUTUBE_API_SERVICE_NAME="youtube"
YOUTUBE_API_VERSION="v3"
youtube = build(YOUTUBE_API_SERVICE_NAME,YOUTUBE_API_VERSION,developerKey=DEVELOPER_KEY)

 3) 댓글 크롤링

  - videoId 부분에 유투브 영상의 videoId 입력

comments = []

results = youtube.commentThreads().list(
    videoId = 'X7-aZpsnw5M',
    order='time',
    part = 'snippet',
    textFormat='plainText',
    maxResults = 100
    ).execute()

 4) 페이지 토큰을 이용한 연속된 크롤링

  - videoId 부분에 유투브 영상의 videoId 입력

  - 크롤링 결과(results)에 존재하는 nextPageToken을 기준으로 하여 계속 크롤링 하는 방식

   * maxResults를 100으로 지정하지 않으면 기본인 20개로 크롤링 하기에 시간 및 코스트에 있어서 손해

while results:
    for item in results['items']:
        comment = item['snippet']['topLevelComment']['snippet']['textDisplay']
        comments.append(comment)
        
    if 'nextPageToken' in results:
            pageToken = results['nextPageToken']
            results = youtube.commentThreads().list(
                videoId = 'X7-aZpsnw5M',
                order='time',
                part = 'snippet',
                textFormat='plainText',
                pageToken = pageToken,
                maxResults = 100
                ).execute()
    else:
        break

2. 확인

print(comments)

 - 결과

  * 대댓글은 크롤링 되지 않음

3. 참고

 - Youtube API 공식문서

Comments