정리 노트

데이터 얻기 본문

K-POP 아이돌 SNS 분석

데이터 얻기

꿈만 꾸는 학부생 2024. 2. 25. 14:43
728x90

이번 포스트에서는 인스타그램, 유튜브 데이터 수집 결과를 공유하기 위한 포스트입니다.

인스타그램 데이터 수집

import instaloader
import pandas as pd
from tqdm import tqdm

loader = instaloader.Instaloader()
loader.login(user='사용자이름', passwd='사용자비밀번호')

user_name = gfriendofficial
# user_name = "wm_ohmygirl"
posts = instaloader.Profile.from_username(loader.context, user_name).get_posts()

data_dict = {"date": [], "media_count": [], "like_count": [], "comment_count": [], "communication_stats": []}
for post in tqdm(posts):
    data_dict["date"].append(post.date)
    data_dict["media_count"].append(post.mediacount)
    data_dict["like_count"].append(post.likes)
    data_dict["comment_count"].append(post.comments)

    stats = post.mediacount * 0.35 + post.likes * 0.25 + post.comments * 0.4
    data_dict["communication_stats"].append(stats)

idol_df = pd.DataFrame(data_dict)
idol_df["date"] = pd.to_datetime(idol_df["date"])

idol_df.to_excel("OhMyGirl_Instagram.xlsx")
print("작업 완료")

위 코드를 통해 두 아이돌 그룹(여자친구, 오마이걸)에 대한 인스타그램 데이터를 수집할 수 있었습니다. 수집 결과는 아래와 같습니다.

gfriendofficial 인스타그램 계정에서 수집한 데이터 일부

유튜브 데이터 수집

from googleapiclient.discovery import build
import pandas as pd
from secret import API_KEY
from tqdm import tqdm

def get_playlist_items(service, pl_id, page_token=None):
    response = service.playlistItems().list(
        playlistId=pl_id,
        part='snippet',
        pageToken=page_token,
        maxResults=50
    ).execute()
    videos = response['items']

    while 'nextPageToken' in response:
        page_token = response['nextPageToken']
        next_response = service.playlistItems().list(
            playlistId=pl_id,
            part='snippet',
            pageToken=page_token,
            maxResults=50
        ).execute()
        response = next_response

        videos.extend(response['items'])

    return videos

youtube_api_service_name = "youtube"
youtube_api_version = "v3"
youtube = build(youtube_api_service_name, youtube_api_version, developerKey=API_KEY)

# 채널 찾기
searched = youtube.search().list(
    q="GFRIEND",
    part="snippet",
    maxResults=10
).execute()

# 플레이리스트 목록 얻기
channel_id = searched['items'][0]['snippet']['channelId']
playlists = youtube.playlists().list(
    part="snippet",
    channelId=channel_id,
    maxResults=100
).execute()

data_dict = {"date": [], "view_count": [], "like_count": [], "comment_count": [], "communication_stats": []}

# 플레이리스트의 동영상 목록 얻기
for item in tqdm(playlists['items']):
    playlist_id = item['id']
    playlist_videos = get_playlist_items(youtube, playlist_id)

    for video in playlist_videos:
        video_id = video['snippet']['resourceId']['videoId']
        video_info = youtube.videos().list(
            part='snippet,contentDetails,statistics',
            id=video_id
        ).execute()

        if video_info['pageInfo']['totalResults'] == 0:
            continue

        print(video_info['items'][0]['snippet']['title'])

        published_date = video_info['items'][0]['snippet']['publishedAt']
        view_count = int(video_info['items'][0]['statistics']['viewCount'])
        like_count = int(video_info['items'][0]['statistics']['likeCount'])

        data_dict['date'].append(published_date)
        data_dict['view_count'].append(view_count)
        data_dict['like_count'].append(like_count)

        try:
            # 유튜브 동영상 중 댓글 사용 중지된 영상들이 존재
            # 이럴 때는 KeyError가 나기 때문에 해당 값을 0으로 삽입
            comment_count = int(video_info['items'][0]['statistics']['commentCount'])
            stats = view_count * 0.35 + like_count * 0.3 + comment_count * 0.35

            data_dict['comment_count'].append(comment_count)
            data_dict['communication_stats'].append(stats)

        except KeyError as ke:
            data_dict['comment_count'].append(0)
            data_dict['communication_stats'].append(view_count * 0.35 + like_count * 0.3)

idol_df = pd.DataFrame(data_dict)
idol_df["date"] = pd.to_datetime(idol_df["date"], format="ISO8601")
print(idol_df.head())
idol_df.to_csv("result.csv")

# timezone 지우기 위한 방법으로 현재 csv 로 저장했다 불러서 사용하는 방법 사용 중
# 분명 더 간단한 방법이 있을 터!
idol_df = pd.read_csv('result.csv').drop("Unnamed: 0", axis=1)
idol_df["date"] = pd.to_datetime(idol_df["date"])
idol_df["date"] = idol_df["date"].apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'))
idol_df.to_excel("GFRIEND_YouTube.xlsx")
print("작업 완료")

위 코드를 통해 아이돌 그룹(여자친구)에 대한 유튜브 데이터를 수집할 수 있었습니다. 수집 결과는 아래와 같습니다.

여자친구 공식 유튜브 채널에서 수집한 데이터 일부

오마이걸 그룹의 유튜브 데이터도 수집을 시도했으나 해당 채널에서 좋아요 수를 공개하지 않았습니다. 이로 인해 동영상의 좋아요 수를 수집할 수 없었습니다.

따라서 기존에 2개의 SNS에 대해 분석하려 했던 것을 인스타그램에 대해서만 분석하는 것으로 축소했습니다.


다음으로 진행할 일(계획)

  • 소통 지수 식 수정(media_count와 다른 열들과의 크기 차이가 너무 큼)
  • 수집한 데이터에 대한 탐색적 데이터 분석 및 시각화 진행
728x90

'K-POP 아이돌 SNS 분석' 카테고리의 다른 글

데이터 시각화  (0) 2024.02.27
구체화 과정  (2) 2024.02.17
googleapiclient로 Youtube 데이터 가져오기  (2) 2024.02.15
사전 과정 - tweepy 살펴보기  (0) 2024.02.10
사전 과정 - instaloader 둘러보기  (0) 2024.02.10