소소한 컴퓨터 이야기

[크롤링] 2. 유튜브 랭킹 데이터 다루기

by Cori

유튜브에서 제공하는 채널 랭킹과 상세 정보 (채널명, 카테고리 정보, 구독자 수, 조회 수, 동영상 수)를 수집, 시각화한다. 

 

* 해당 포스팅에서 다루고 있는 모든 내용은 다음 서적을 참고하였습니다.

 

직장인을 위한 데이터 분석 실무 with 파이썬(개정판)(위키북스 데이터 사이언스 시리즈 63)

‘데이터 분석은 좋은 질문에서 시작합니다’이 책에서는 누구나 궁금했던 그 질문에 대해 데이터로 답해 봅니다. 이 책은 파이썬을 처음 접하는 마케팅, 영업, 기획 실무 담당자들이 파이썬을

book.naver.com


0. 기본 환경 설정

from selenium import webdriver
from bs4 import BeautifulSoup
import time 
import pandas as pd 

browser = webdriver.Chrome('./chromedriver.exe')
# 유튜브 랭킹 페이지 주소 
url = 'https://youtube-rank.com/board/bbs/board.php?bo_table=youtube'   
browser.get(url)

html = browser.page_source   # 접속한 웹 페이지의 HTML 다운로드
soup = BeautifulSoup(html, 'html.parser')   # BeautifulSoup으로 읽음

유튜브 랭킹 페이지

1. 엑셀 파일에 저장할 데이터 설정, 위치 탐색

channel_list = soup.select('form > table > tbody > tr')

for channel in channel_list:
    title = 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

유튜브 사이트에서 '채널명, 카테고리 정보, 구독자 수, 조회 수, 동영상 수'를 수집한다. 

 

· title 정보 탐색 시 <tr> 태그에 <a> 태그가 여러 개 존재하기 때문에, 부모 태그와 함께 탐색

· subscriber 정보 탐색 시 <tb> 태그의 구독자 수 클래스 이름 사용하여 탐색 (.subscriber_cnt)

· view 정보 탐색 시 <tb> 태그의 조회 수 클래스 이름 사용하여 탐색 (.view_cnt)

· video 정보 탐색 시 <tb> 태그의 동영상 수 클래스 이름 사용하여 탐색 (.video_cnt)

 

2. 다른 페이지들의 데이터 수집 및 배열에 저장

-> url을 살펴보면 페이지를 이동할 때, 주소의 맨 뒤에 page= {} 부분이 추가되고, 이 값만 변경된다. 이를 이용하여 여러 페이지에서 원하는 데이터를 수집해보자

results = [] 
for page in range(1, 11):
    url = f'https://youtube-rank.com/board/bbs/board.php?bo_table=youtube&page={page}'
    browser.get(url)
    time.sleep(2)  # 2초 동안 기다림
    html = browser.page_source
    soup = BeautifulSoup(html, 'html.parser')
    
    channel_list = soup.select('form > table > tbody > tr')
    for channel in channel_list:
        title = 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)

반복문을 실행하면 매번 페이지를 이동하기 때문에, 해당 페이지의 HTML 문서를 매번 가져와 태그를 수집해야 함 

화면이 정상적으로 로딩된 후 HTML 문서를 가져와야 하기 때문에, 각 반복마다 화면을 이동한 후 대기 시간 설정 .. 

 

3. 크롤링 결과 엑셀 파일 저장

df = pd.DataFrame(results)
df.columns = ['title', 'category', 'subscriber', 'view', 'video']
df.to_excel('./youtube_rank.xlsx', index = False)

 

4. 유튜브 랭킹 데이터 시각화

0) 필요 라이브러리 import, 한글 글꼴 설정

import pandas as pd 
import matplotlib.pyplot as plt 
from matplotlib import font_manager, rc 
import platform

# 그래프에서 한글을 표기하기 위해 글꼴 변경 
if platform.system() == 'Windows':
    path = 'c:/Windows/Fonts/malgun.ttf'
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font',family=font_name)
elif platform.system() == 'Darwin':   # macOS
    rc('font',family = 'AppleGothic')
else:
    print('Check your OS system')

1) 엑셀 파일 불러오고, 데이터 전처리하기

df = pd.read_excel('./youtube_rank.xlsx')
df.head()

유튜브 랭킹 데이터 크롤링한 결과값 조회

df['replaced_subscriber'] = df['subscriber'].str.replace('만','0000')   # 숫자 타입으로 변환
df['replaced_subscriber'] = df['replaced_subscriber'].astype('int')   # 그래프 시각화를 위함

subscriber 컬럼을 조작하여, replaced_subscirber라는 새로운 컬럼을 생성한다.

pivot_df = df.pivot_table(index='category', values='replaced_subscriber',aggfunc=['sum','count'])
pivot_df.columns = ['subscriber_sum', 'category_count']   # columnn을 이용해 컬럼명 변경
pivot_df = pivot_df.reset_index()   # 인덱스 초기화 
pivot_df = pivot_df.sort_values(by='subscriber_sum', ascending=False)   # 내림차순 정렬 
pivot_df.head()

카테고리 별 구독자 수, 채널 수 피벗 테이블

피벗테이블의 각 칼럼은 데이터프레임에서 인덱스로 설정되어 있기 때문에, 인덱스를 초기화해주었다. 이후 sort_values() 함수를 이용해 피벗테이블을 구독자 수 합계 기준으로 내림차순으로 정렬 (카테고리 시각화를 할 경우에는 피벗테이블을 카테고리 수 기준으로 내림차순으로 정렬해보자) 

 

2) 데이터 시각화하기

plt.figure(figsize=(30, 10))
plt.pie(pivot_df['subscriber_sum'], labels=pivot_df['category'],autopct='%1.1f%%')
plt.show()

카테고리 별 구독자 수 시각화 (pie chart)

plt.figure(figsize = (30, 10)) 
plt.pie(pivot_df['category_count'], labels = pivot_df['category'], autopct='%1.1f'%%')
plt.show()

카테고리 별 카테고리 수 시각화 (pie chart)

블로그의 정보

코딩하는 오리

Cori

활동하기