YouTuber 마이닝 #1
이 기사는 자신을 포함한 YouTuber 팬이 좋아하는 이유를 분석하는 데이터 분석을 수행하는 기사입니다.
이것은 시리즈적으로 갱신해 갑니다.
이 기사에서 한 일
위의 이미지는 귀여운 여성 YouTuber "유키리누"의 채널 ↓에서 얻은 데이터.
코드와 해설
코드 여기에 있다
haradai1262/Notebooks-for-youtube-api-usage
1. YouTube Data API와의 연결
import sys
from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.tools import argparser
import devkey
DEVELOPER_KEY = devkey.api
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
CHANNEL_ID = 'UCMsuwHzQPFMDtHaoR7_HDxg' # channel id of japanese popular (and cute) youtuber "Yukirinu"
# connection build
YT = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY)
여기는 YouTube API와 연결하는 코드입니다.
'DEVELOPER_KEY'는 스스로 취득할 필요가 있으므로 주의.
YouTube Data API v3 개요
DEVELOPER_KEY를 얻는 방법
CHANNEL_ID는 채널 URL이 "htps //w w. 요츠베. 코 m / 짱 l / 우 CM wHz QPFMD 테오 R7_HDxg"이면 "UCMsuwHzQPFMDtHaoR7_HDxg"입니다.
2. 채널 동영상 목록 얻기
def get_channel_vlist( yt, cid, max_num ):
channel_videos_tmp = []
feed = yt.search().list( channelId=cid, maxResults=1, order='date', type='video', part='id' ).execute()
nextPageToken = feed[ 'nextPageToken' ]
video_idx = 1
while 1:
if video_idx > max_num: break
video_idx += 1
if not 'nextPageToken' in feed: break
nextPageToken = feed[ 'nextPageToken' ]
vid = feed.get('items')[0]['id']['videoId']
channel_videos_tmp.append( vid )
feed = yt.search().list( channelId=cid, maxResults=1, order='date', type='video', part='id', pageToken = nextPageToken ).execute()
return channel_videos_tmp
channel_videos = get_channel_vlist( YT, CHANNEL_ID, 10 )
여기에서는 CHANNNEL_ID에서 게시물 동영상을 ID로 가져옵니다.
덧붙여 API의 사양상?, 이 코드라면 최대 500건 정도밖에 취득할 수 없습니다.
※ 괜찮은 일 스크레이핑하면, 모두 취득할 수 있을까 생각합니다. timestamp 확인하고 여러 번 실행하거나 ...
3. 동영상 목록에서 각 동영상의 정보 얻기
def get_video_detail( vid ):
video_detail = YT.videos().list(part="id,snippet,statistics,contentDetails,topicDetails",id=vid).execute()
return video_detail.get("items",[])[0]
vlist_details = [ get_video_detail( i ) for i in channel_videos ]
channel_video_info = {} # { idx : video_details(dictionary) }
for i, v_detail in enumerate(vlist_details):
channel_video_info[i] = v_detail
여기에서는 이전에 취득한 동영상 ID의 리스트로부터 각 동영상의 상세를 취득하고 있습니다(JSON 형식).
YouTube Data API를 사용하면 제목, 태그, 설명 문장, 시청, 좋아하는 숫자 등의 통계 등 다양한 정보를 얻을 수 있습니다.
이 코드에서는 "part="id,snippet,statistics,contentDetails,topicDetails"에서 검색할 정보를 선택합니다.
검색 가능한 정보에 대한 자세한 내용은 아래에 설명되어 있습니다.
Videos: list | YouTube Data API (v3)
4. 취득한 동영상 정보를 데이터 프레임화
info_tree = {
'id': None,
'snippet': ['title','description','liveBroadcastContent','tags','publishedAt','thumbnails'],
'statistics': ['viewCount','likeCount','favoriteCount','dislikeCount','commentCount'],
'contentDetails':['caption','definition','dimension','duration','projection'],
'topicDetails':['TopicIds', 'relevantTopicIds'],
}
df_cols = []
for parent, child in info_tree.items():
if child == None: df_cols.append( parent )
else:
for c in child: df_cols.append( c )
rows = []
for i, v in channel_video_info.items():
row = []
for parent, child in info_tree.items():
if child == None: row.append( v[parent] )
elif parent == 'snippet':
for c in child:
if c == 'thumbnails':
row.append( v[parent][c]['default']['url'] )
elif c == 'tags':
if not 'tags' in v['snippet']: row.append( None )
else: row.append( v[parent][c] )
else:
row.append( v[parent][c] )
elif parent == 'topicDetails':
if 'topicDetails' in v:
for c in child:
if c in v[parent]: row.append( v[parent][c] )
else: row.append( None )
else:
row.append( None )
row.append( None )
else:
for c in child: row.append( v[parent][c] )
rows.append( row )
여기에서는 취득한 동영상의 정보를 DataFramen에 저장하기 위해 정리하고 있습니다.
JSON에서 취득한 각 데이터를 1행의 레코드로 하기 위해 여러가지 하고 있습니다만, 결과 엉망입니다. 아무튼 움직이면 좋다.
※ 처음에는 깨끗했습니다만, 예외 처리(topicId가 없는 데이터가 있는, tags가 없는 데이터가 있다, 등)를 추가하고 있으면 굉장히 더러워졌습니다. 언젠가 정리...
import pandas as pd
df = pd.DataFrame( rows, columns=df_cols )
print( df.shape )
df.head()
마지막으로 데이터 프레임에 저장하고 끝입니다.
좋은 느낌이 들었습니다.
취득한 데이터를 이용한 분석은 #2
트윗
Reference
이 문제에 관하여(YouTuber 마이닝 #1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/myaun/items/7425ad451638c6367f20텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)