[텍스트마이닝] 유튜브 크리에이터 비교 및 분석 with python
이것은 3학년 텍스트마이닝 수업 과제로 진행했던 유튜버 크리에이터 분석이다. 오늘부터 차근차근 정리해보려고 한다. : )
1. 분석할 데이터 및 목표
- 유튜브 인기채널인 '펭수'와 '워크맨'을 전반적으로 크롤링.
- 어떤영상이 인기가 가장 많은지, 인기가 많은 요인은 무엇인지 게시글 및 댓글 분석
* 기존에 네이버부동산을 크롤링하여 원하는 조건(평수, 지역, 지하철역 등)에 따라 집을 추천해주는 추천서비스를 만들어보려 하였으나, 태그를 크롤링해오지 못하는 문제가 있어 주제를 변경함ㅜㅜ
1-2. DataSet 소개
1) 최종적으로는 2개의 Dataset
: 펭수 및 워크맨 영상(paw), 각 동영상별 댓글(paw_reply)
* 펭수 및 워크맨은 각각 1개의 dataset이나 결국 2개를 1개로 합침(paw)
2) 코드 파일은 총 4개
- 1, 2: 는 각 영상(Pengsu, workman)의 dataset 분석 코드
- 3: 1,2를 합친 코드 + 머신러닝
- 4: 3을 통해 NMF(Non-negative matrix factorization, NMF)를 진행한 것
2. 코드 설명
2-1. Pengsu, Workman Dataset 코드: 펭수 및 워크맨 코드 개별 구현 후 전처리에서 병합.
1) 패키지 import: 두 파일 모두 동일
* Konlpy: 한국어 분석을 위한 패키지. 형태소 분석, 명사 분석 등 한국어에 특화된 분석 가능
- Konlpy를 사용하기 위해서는 부가적으로 java설치 및 환경변수 설정 등 먼 여행을 떠나야한다.
이건 추후 포스팅
* selenium: 웹 브라우저를 제어하는 패키지. 유투브 화면 클릭, 스크롤 제어 등에 사용
# 패키지 import
import datetime as dt
import pandas as pd
import requests
import time
import urllib.request #
import re
import konlpy
from bs4 import BeautifulSoup
from pandas import DataFrame
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
2) Data 입력: Chrome Driver, Crawling
Chrome Driver를 통해 별도 창을 Open 후, 해당 창에서 data를 crawling함
스크롤 다운이 필요한 페이지이므로 스크롤제어를 사용.
* num_of_pagedowns를 조정하여 스크롤 횟수를 지정
#크롬드라이버 연결
delay=0.1
browser = Chrome()
browser.implicitly_wait(delay)
start_url = 'https://www.youtube.com/channel/UCtckgmUcpzqGnzcs7xEqMzQ/videos'
browser.get(start_url)
browser.maximize_window()
body = browser.find_element_by_tag_name('body')#스크롤하기 위해 소스 추출
num_of_pagedowns = 30
#스크롤 다운
while num_of_pagedowns:
body.send_keys(Keys.PAGE_DOWN)
time.sleep(0.1)
num_of_pagedowns -= 1
이를 실행하면 아래와 같이 추가적인 창이 실행된다. (미리 크롬드라이버 설치필요. 설치 링크는 아래!)
https://countrymouse.tistory.com/entry/ChromeDriver
# 페이지 소스 받아오기
html0 = browser.page_source
html = BeautifulSoup(html0,'html.parser')
# 리스트 선언
title_list = [] #제목 리스트 생성
href_list = [] #주소 리스트 생성
viewcountmake_list = [] #조회수 크롤링 위한 리스트 생성
viewcount_list = [] #조회수 리스트 생성
# 구독자 수 저장
subsc = html.find(id="subscriber-count").text
subsc = subsc[4:]
# title 저장
for tr in html.find_all(id="video-title"):
title = tr.get('title')
title_list.append(title)
#href 태그 내용 저장
for tr in html.find_all(id="video-title"):
href = tr.get('href')
href_list.append(href)
# 조회수 저장
for tr in html.find_all('span', class_="style-scope ytd-grid-video-renderer"):
viewcount = tr.get_text('span')
viewcountmake_list.append(viewcount)
contents_count = len(title_list)
#구독자수, 동영상 수
print("구독자 수:",subsc, ",영상 개수:", contents_count)
간단하게 썸네일에 있는 정보로 dataframe을 만들어서 값을 잘 받아왔는지 확인해본다.
intro_df = pd.DataFrame({'구분': "펭수", '구독자':subsc, '영상수':contents_count}, index = [1])
intro_df.head()
#전처리 전 title, 주소, 좋아요수 데이터프레임 생성
print(len(title_list), len(href_list), len(viewcountmake_list))
# viewcountmake_list의 경우 조회수와 등록일이 각각 생성되어 list크기가 다름 -> 데이터프레임 생성 불가
# 데이터 클리닝 작업(조회수와 등록일에서 등록일 제거)
for tr in range(0,len(viewcountmake_list),2):
a = viewcountmake_list[tr]
viewcount_list.append(a)
# 조회수 데이터 전처리
clean_viewcount = []
for i in viewcount_list:
a = i[4:-2]
amul = float(a)*10000
clean_viewcount.append(int(amul))
print(clean_viewcount)
#title, 주소, 좋아요수 데이터프레임 생성
peng_list = pd.DataFrame({'title':title_list, 'href':href_list, 'viewcount':clean_viewcount})
peng_list.head()
peng_list.sort_values(by=['viewcount'], axis=0, ascending=False)
여기까지 영상에 대한 기본적인 dataframe이 저장되었다.
글이 많이 길어지는 관계로 다음 화에서는 각 영상별 제목 / 본문내용 / 조회수 / 좋아요 / 싫어요 / 작성일 / 주소 dataframe을 생성,
그 후에는 시각화 및 머신러닝을 진행할 예정이다!
'직장생활 > Programming (C, Python)' 카테고리의 다른 글
[Python] import / pip install opencv, cv2 설치 오류 및 해결 (0) | 2021.07.29 |
---|---|
[Colab] 구글 코랩(Google Colaboratory): Jupyter notebook보다 편한 python 개발 환경 (0) | 2021.07.29 |
[ML] Image Analysis Project - Object Detection (CNN, R-CNN, Fast R-CNN, Faster R-CNN, SSD) (0) | 2021.07.29 |
KoNLPy 설치 / 다운로드 (0) | 2021.07.06 |
크롬드라이버(Chrome Driver) 설치, 다운로드 (0) | 2021.07.06 |