YouTuber 마이닝 #1

YouTube와 YouTuber를 좋아합니다.
이 기사는 자신을 포함한 YouTuber 팬이 좋아하는 이유를 분석하는 데이터 분석을 수행하는 기사입니다.
이것은 시리즈적으로 갱신해 갑니다.

이 기사에서 한 일


  • YouTube Data API에서 채널에서 정보를 얻는 방법 시도
  • 취득한 정보를 DataFrame (pandas)에 저장한다



  • 위의 이미지는 귀여운 여성 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

    트윗


  • 유튜브 데이터 세트를 공개하고 싶을지도 유명한 유튜버 목록을 원하기 때문에 스크래핑에 적합한 사이트가 있다면 알고 싶습니다
  • 간단하게, 구독자 수에 대한 비디오의 시청 수와 좋아하는 수 (Like) 수로 팬의 열량 같은 것을 분석 할 수 있습니다
  • 이런 일 해 보면? 같은 요청 기다리고 있습니다!
  • 좋은 웹페이지 즐겨찾기