반응형

[텍스트마이닝] 유튜브 크리에이터 비교 및 분석 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

 

크롬드라이버(Chrome Driver) 설치, 다운로드

텍스트마이닝을 업로드하던 중 사전 진행필요한 절차가 많아 크롬드라이버 설치 및 konlpy등을 먼저 포스팅. 크롬드라이버는 crawling을 위해 필요한 프로그램으로 크롤링 시 추가적인 창을 띄워

countrymouse.tistory.com

 

# 페이지 소스 받아오기

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()

#viewcount순으로 정렬

peng_list.sort_values(by=['viewcount'], axis=0, ascending=False)

여기까지 영상에 대한 기본적인 dataframe이 저장되었다.

글이 많이 길어지는 관계로 다음 화에서는 각 영상별 제목 / 본문내용 / 조회수 / 좋아요 / 싫어요 / 작성일 / 주소 dataframe을 생성,

그 후에는 시각화 및 머신러닝을 진행할 예정이다!

 

반응형

+ Recent posts