[크롤링] 2. 유튜브 랭킹 데이터 다루기
by Cori유튜브에서 제공하는 채널 랭킹과 상세 정보 (채널명, 카테고리 정보, 구독자 수, 조회 수, 동영상 수)를 수집, 시각화한다.
* 해당 포스팅에서 다루고 있는 모든 내용은 다음 서적을 참고하였습니다.
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()
plt.figure(figsize = (30, 10))
plt.pie(pivot_df['category_count'], labels = pivot_df['category'], autopct='%1.1f'%%')
plt.show()
'AI > Data Analysis' 카테고리의 다른 글
[Elastic Search] 데이터 검색 (0) | 2021.10.25 |
---|---|
[크롤링] 외국인 관광객 데이터 다루기 (2) (0) | 2021.09.07 |
[크롤링] 3. 외국인 관광객 데이터 다루기 (1) (0) | 2021.08.30 |
[크롤링] 1. 음원 정보 수집하기 (0) | 2021.08.25 |
HTML 태그 탐색하기 (0) | 2021.08.24 |
블로그의 정보
코딩하는 오리
Cori