본문 바로가기
IT

Python을 이용한 이용한 유튜브 (YouTube) 댓글 수집

by CHML 2021. 1. 17.
1. YouTube Data API

YouTubue 댓글 수집에는 Google에서 제공하는 YouTube Data API를 이용하는 방법과 동영상이 게시된 HTML 문서에서 직접 데이터를 크롤링 (crawling)하는 방법이 있다. 그러나 크롤링 방식은 YouTube에 의해 크롤링 코드의 접근이 차단되거나, 홈페이지 업데이트로 인해 HTML 문서의 형식이 변경되면 동작하지 않을 수 있다는 문제점이 있다.

이 글에서는 Python과 Google에서 제공하는 YouTube Data API를 이용하여 YouTube에 게시된 동영상의 댓글을 수집하는 방법을 소개한다. 개인적인 용도로 API를 이용할 경우에는 할당량을 초과할 일이 거의 없지만, 공개 서비스를 제공하기 위한 목적으로 API를 이용하는 경우에는 반드시 자신의 API 사용량과 Google의 과금 정책을 확인해야 한다.

 

1.1. Google API 프로젝트 생성

Google 계정에 로그인한 다음, Google API console에 접속하여 API 프로젝트를 생성한다. 기존에 생성해놓은 API 프로젝트가 있다면, 그것을 그대로 사용해도 된다. 

 

그림 2. Google API 프로젝트 생성.

 

1.2. YouTube Data API 활성화

생성된 프로젝트에서 왼쪽의 라이브러리를 클릭하여 라이브러리 검색 화면으로 이동한다. 검색창에 "youtube"를 입력하고, 검색된 YouTube Data API v3를 클릭한다. 그 다음 이동된 화면에서 "사용"버튼을 클릭하여 YouTube Data API v3를 활성화한다. 활성화에는 약 1분 정도의 시간이 소요된다.

 

그림 3. YouTube Data API 활성화.

 

1.3. 사용자 인증 정보에서 API 키 발급

API 활성화 화면에서 "사용"버튼을 클릭하면 나타나는 "사용자 인증 정보 만들기"를 클릭하여 API 키를 발급받는다. API 키를 발급 받기 위해 그림 4와 같이 사용하려는 API, API 호출 플랫폼, 목적 데이터를 설정하고 사용자 인증 정보를 추가한다. 마지막으로 "어떤 사용자 인증 정보가 필요한가요? 버튼을 클릭하면 API 키가 발급된다.

 

그림 4. 사용자 인증 정보 추가 및 API 키 발급.

앞으로 YouTube Data API를 이용할 때는 발급 받은 API 키를 이용할 것이다. API 키는 API를 이용하기 위한 일종의 암호와 같은 것이기 때문에 노출하지 않도록 주의해야 한다.

 

2. Python으로 YouTube Data API 이용하기

먼저 Python으로 Google API를 이용하기 위해 아래의 pip 명령어를 이용하여 Google API Client 라이브러리를 다운 받는다.

pip install google-api-python-client

 

라이브러리 설치가 끝나면 Python 스크립트에서 pandas와 googleapiclient.discovery의 build를 import한다. pandas는 수집한 댓글을 엑셀의 형태로 저장하기 위한 라이브러리이며, googleapiclient.discovery의 build는 Google API를 호출하기 위한 객체를 지원하는 라이브러리이다.

1
2
import pandas
from googleapiclient.discovery import build
cs

 

그 다음, List 타입의 comments를 만든다. 이 변수에는 수집한 댓글이 저장될 것이다. 두 번째 줄에서는 import한 build 함수를 이용하여 다음과 같이 Google API 객체를 생성한다. build 함수에 이용된 api_key에는 앞에서 발급 받은 API 키를 입력한다. 마지막으로 세 번째 줄과 같이 API 객체를 호출한다. 이 때, video_id에는 댓글을 수집하고자 하는 YouTube 동영상의 id를 입력한다. API를 호출하면 response 변수에 전달 받은 데이터가 저장된다.

1
2
3
comments = list()
api_obj = build('youtube''v3', developerKey=api_key)
response = api_obj.commentThreads().list(part='snippet,replies', videoId=video_id, maxResults=100).execute()
cs

 

API 객체 생성과 호출이 완료되면, 반복문을 통해 댓글 저장과 API 호출을 반복적으로 수행한다. 이 예제에서는 하나의 댓글에 대해 아래의 네 가지 정보 (댓글 내용, 댓글 작성자, 작성 시간, 좋아요 수)를 수집한다. YouTube Data API는 이외에도 다양한 정보를 수집할 수 있도록 지원하며, 자세한 정보는 API 문서에 제공되어 있다.

  • textDisplay: 댓글의 내용
  • authorDisplayName: 댓글 작성자
  • publishedAt: 댓글 작성 시간
  • likeCount: 좋아요 수

6~10번째 줄에서는 댓글에 대한 댓글 (reply)이 있는 경우에 reply도 같이 수집하는 코드이다. 마지막으로, 11~15번째 줄에서는 동영상에서 가져올 댓글이 아직 남은 경우에 nextPageToken을 기반으로 API를 다시 호출한다. 반복적인 API 호출을 통해 수집된 댓글은 앞에서 선언한 comments라는 list 타입의 변수에 저장된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while response:
    for item in response['items']:
        comment = item['snippet']['topLevelComment']['snippet']
        comments.append([comment['textDisplay'], comment['authorDisplayName'], comment['publishedAt'], comment['likeCount']])
 
        if item['snippet']['totalReplyCount'> 0:
            for reply_item in item['replies']['comments']:
                reply = reply_item['snippet']
                comments.append([reply['textDisplay'], reply['authorDisplayName'], reply['publishedAt'], reply['likeCount']])
 
    if 'nextPageToken' in response:
        response = api_obj.commentThreads().list(part='snippet,replies', videoId=video_id, pageToken=response['nextPageToken'], maxResults=100).execute()
    else:
        break
cs

 

마지막으로, pandas 라이브러리를 이용하여 comments에 수집된 댓글을 엑셀 파일로 저장한다. 엑셀 파일의 이름은 results.xlsx이며, 각 열의 이름은 comment, author, date, num_likes가 된다.

1
2
df = pandas.DataFrame(comments)
df.to_excel('results.xlsx', header=['comment''author''date''num_likes'], index=None)
cs

 

Python과 YouTube Data API를 이용하여 YouTube 동영상의 댓글을 수집하기 위한 전체 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import pandas
from googleapiclient.discovery import build
 
 
api_key = '발급 받은 API 키'
video_id = '추출하고자 하는 동영상의 id'
 
comments = list()
api_obj = build('youtube''v3', developerKey=api_key)
response = api_obj.commentThreads().list(part='snippet,replies', videoId=video_id, maxResults=100).execute()
 
while response:
    for item in response['items']:
        comment = item['snippet']['topLevelComment']['snippet']
        comments.append([comment['textDisplay'], comment['authorDisplayName'], comment['publishedAt'], comment['likeCount']])
 
        if item['snippet']['totalReplyCount'> 0:
            for reply_item in item['replies']['comments']:
                reply = reply_item['snippet']
                comments.append([reply['textDisplay'], reply['authorDisplayName'], reply['publishedAt'], reply['likeCount']])
 
    if 'nextPageToken' in response:
        response = api_obj.commentThreads().list(part='snippet,replies', videoId=video_id, pageToken=response['nextPageToken'], maxResults=100).execute()
    else:
        break
 
df = pandas.DataFrame(comments)
df.to_excel('results.xlsx', header=['comment''author''date''num_likes'], index=None)
 
cs

 

3. YouTube 동영상에서 댓글 추출하기

앞에서 구현한 Python 코드를 이용하여 실제 YouTube 동영상에서 댓글을 수집한다. 예제로 mathematicalmonk 채널의 "(ML 7.5) Beta-Bernoulli model (part 1)"이라는 동영상에 달린 댓글을 추출했다. 작성일을 기준으로 동영상에는 총 7개의 댓글 및 댓글에 대한 reply가 있으며, 위에서 작성한 Python 코드를 실행하면 그림 5와 같이 API를 통해 수집된 7개의 댓글이 엑셀 파일로 저장된다.

 

그림 5. 수집된 댓글의 내용, 작성자, 작성 시간, 좋아요 수.