ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2월 3주차-2/18(3)]📊 YouTube 채널 랭킹 크롤링 및 데이터 분석
    Why Not SW CAMP 5기/수업 기록 2025. 2. 18. 16:01

    YouTube 채널 랭킹 데이터를 크롤링하여 구독자 수, 조회 수, 동영상 수를 수집하고, Excel 파일로 저장한 후 시각화하는 과정을 소개한다. 🚀


    1️⃣ YouTube 채널 랭킹 크롤링 🕵️‍♂️

    Selenium을 이용해 YouTube 랭킹 사이트(10페이지) 데이터를 크롤링한다.

    # 라이브러리 불러오기
    from selenium import webdriver
    from bs4 import BeautifulSoup
    import pandas as pd
    import time
    import re
    
    # 크롬 브라우저 실행
    browser = webdriver.Chrome()
    
    # 결과 저장 리스트
    results = []	# [title, category, subscriber, view, video]
    
    # 1~10페이지 크롤링
    for page in range(1, 11):
        url = f'https://youtube-rank.com/board/bbs/board.php?bo_table=youtube&page={page}'
        browser.get(url)
        
        # 2초 대기
        time.sleep(2)
        
        # HTML 가져오기
        html = browser.page_source
        soup = BeautifulSoup(html, 'html.parser')
        
        # 채널 리스트 추출
        channel_list = soup.select('form > table > tbody > tr')
        
        for channel in channel_list:
            # 채널명 추출 (특수문자 제거)
            title = re.sub(r'[^\w\s가-힣]', '', channel.select('h1 > a')[0].text.strip())
            # 카테고리 추출
            category = channel.select('p.category')[0].text.strip()
            # 구독자 수 추출
            subscriber = channel.select('.subscriber_cnt')[0].text
            # 조회 수 추출
            view = channel.select('.view_cnt')[0].text
            # 동영상 수 추출
            video = channel.select('.video_cnt')[0].text
            
            data = [title, category, subscriber, view, video]
            results.append(data)
    
    # 데이터프레임 생성 및 Excel 저장
    df = pd.DataFrame(results, columns=['title', 'category', 'subscriber', 'view', 'video'])
    df.to_excel('./files/youtube_rank.xlsx', index=False)

    YouTube 랭킹 사이트에서 1~10페이지 데이터를 크롤링하여 엑셀 파일로 저장!

    df.head()
    '''
    title     category subscriber       view   video
    0    BLACKPINK   [음악/댄스/가수]      9590만  378억7825만    604개
    1    김프로KIMPRO  [BJ/인물/연예인]      8690만  547억3689만  2,979개
    2    BANGTANTV   [음악/댄스/가수]      7980만  244억0527만  2,699개
    3  HYBE LABELS   [음악/댄스/가수]      7650만  380억8129만  2,294개
    4   Mark Rober        [미분류]      6430만  102억4266만    196개
    '''

     


    2️⃣ Excel 저장 오류 해결 ⚠️

    특수문자가 포함된 경우, Excel에서 "cannot be used in worksheets." 오류가 발생할 수 있다. 이를 해결하기 위해 한글, 영문, 숫자, 공백을 제외한 모든 특수문자를 제거해야 한다.

    ✅ 해결 방법: re.sub() 사용

    import re
    
    # 특수문자 제거
    clean_text = re.sub(r'[^\w\s가-힣]', '', text)
    

    📌 r'[^\w\s가-힣]'의 의미:

    • \w → 영문, 숫자, _ 포함
    • \s → 공백(space, tab, 줄바꿈 포함)
    • 가-힣 → 한글 범위
    • ^ → 부정(NOT), 즉 위의 문자들을 제외한 나머지 제거

    Excel 저장 오류 없이 클린한 데이터를 저장 가능!


    3️⃣ YouTube 데이터 분석 및 시각화 📊

    Excel 파일을 불러와 카테고리별 구독자 수와 채널 수를 분석하고 시각화한다.

    import pandas as pd
    import matplotlib.pyplot as plt
    from matplotlib import font_manager, rc
    import platform
    
    # 한글 폰트 설정
    if platform.system() == 'Darwin':
        rc('font', family='AppleGothic')
    elif platform.system() == 'Windows':
        path = 'c:/Windows/Fonts/malgun.ttf'
        font_name = font_manager.FontProperties(fname=path).get_name()
        rc('font', family=font_name)
    else:
        print("sorry")
        
    # 데이터 불러오기
    df = pd.read_excel('./files/youtube_rank.xlsx')
    df.head()
    

    📌 데이터 예시

             title     category subscriber       view   video
    0    BLACKPINK   [음악/댄스/가수]      9590만  378억7825만    604개
    1    김프로KIMPRO  [BJ/인물/연예인]      8690만  547억3689만  2,979개
    2    BANGTANTV   [음악/댄스/가수]      7980만  244억0527만  2,699개
    

    4️⃣ 데이터 변환 및 분석 🔍

    구독자 수를 정수형 데이터로 변환하여 분석한다.

    df['replaced_subscriber'] = df['subscriber'].str.replace('만', '0000').astype('int')
    

    📌 구독자 수, 채널 수 피봇 테이블 생성

    pivot_df = df.pivot_table(index='category', values='replaced_subscriber', aggfunc=['sum', 'count'])
    pivot_df.columns = ['subscriber_sum', 'category_count']
    pivot_df = pivot_df.reset_index()
    

    📌 정렬된 데이터 예시

        category  subscriber_sum  category_count
    0  [음악/댄스/가수]       888860000             139
    1        [미분류]       782960000             240
    2      [키즈/어린이]       464780000             131
    

    5️⃣ 카테고리별 구독자 수 및 채널 수 시각화 📈

    # 카테고리별 구독자 수 파이차트
    plt.figure(figsize=(12,6))
    plt.pie(pivot_df['subscriber_sum'], labels=pivot_df['category'], autopct='%1.1f%%')
    plt.title('카테고리별 구독자 수')
    plt.show()
    
    # 카테고리별 채널 수 파이차트
    plt.figure(figsize=(12,6))
    plt.pie(pivot_df['category_count'], labels=pivot_df['category'], autopct='%1.1f%%')
    plt.title('카테고리별 채널 수')
    plt.show()
    

    카테고리별 구독자 수와 채널 수를 직관적으로 확인 가능!


    🎯 최종 정리 📌

    YouTube 랭킹 사이트에서 10페이지 크롤링
    Excel 저장 오류(✅ **Excel 저장 오류(\x08` 문제) 해결
    카테고리별 구독자 수 및 채널 수 분석
    Matplotlib을 활용한 데이터 시각화

    이제 YouTube 채널 데이터를 한눈에 분석하고 활용할 수 있다! 🚀

Designed by Tistory.