브랜드 유튜브채널 가치평가 모델 - 1. 유튜브 크롤링 youtube crawling youtube scraping
이 프로젝트는 9월 4일부터 10월 16일까지 진행한 프로젝트이다.
covid19로 사회적 거리두기를 시행하는 상황에서
브랜드의 언택트 마케팅에 관한 데이터를 수집하고 그것이 매출에 어떠한 영향을 미치는지
에서 시작된 프로젝트였다.
언택트 마케팅에 집중하여 자주 사용되는 소셜 네트워크 중 하나의 플랫폼을 정해 데이터를 추출하고 분석하기로 했다.
그중 마케팅 전쟁에 휩싸인 YOUTUBE를 선정하여 데이터를 추출하기로 했다.
모집단은 2019년 누적 조회수 상위 100개 브랜드 채널
일반 시청자의 입장에서 우리가 추출할 수 있는 데이터는 많지 않았다.
채널별 데이터 -
구독자 수 , 영상 수, 누적 조회수, 가입한 날, 평균 조회수, 연간 평균 업로드 수
영상별 데이터 -
좋아요 수, 싫어요 수, 댓글 수, 댓글, 조회수, 영상길이
그중 변수로서의 가치가 있을법한 데이터를 크롤링하기로 했다.
여기까지도 굉장히 오랜 시간이 소요됐다. 뽑아올 정보는 한정적인데 그 정보를 어떻게 사용할지에 대한 답이 계속 정해지지 않았다.
어떤 변수를 y값으로 두고 어떤 변수를 x값으로 넣어 어떤 정보를 알아내고 싶은 건지 답이 안 나왔음....
우리 팀 전부 다 유튜브에 대한 domain knowledge가 부족했기 때문에 매일같이 언택트 마케팅에 대한 논문을 뒤지고
유튜브에 대한 정보를 수집했다.
그리고 이틀에 한 번씩 회의를 진행했다.
그러던 와중 크롤링을 진행했다.
일단은 영상별 데이터를 크롤링할 코드를 짰다.
from selenium import webdriver
from bs4 import BeautifulSoup as bs
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import pandas as pd # 필요한 모듈 import
import time
import re
import requests
import urllib.request
import datetime as dt
# 빈 list를 만듬
channels = ['11번가','1등 카셰어링쏘카','금호타이어 엑스타TV','기아자동차','나이키 골프 코리아 유튜브','넥슨 YouTube',
'넷마블 TV','도미노피자','롯데칠성 주류','롯데푸드','배달의민족','배스킨라빈스 Baskinrobbins KOREA','버거킹','빙그레',
'삼성생명','삼성전자 뉴스룸','삼성카드 Samsung Card','삼성화재','신한카드','아이오페(IOPE)','알바천국',
'에뛰드하우스(ETUDE HOUSE)','에이프릴스킨APRILSKIN','엘페이 | 엘포인트','요기요(YogiyoKr)','위메프','이니스프리',
'커피라는행복맥심','코리아유니클로','토니모리','티몬 TMON Official','한국 맥도날드','한국화이자제약','한율',
'한화 TV [Hanwah TV]','헤라HERA','현대자동차','현대자동차그룹','현대카드','Acuvue Korea','adidas Korea',
'Amway Korea','Apple 대한민국','Audi Korea아우디 코리아','Bccard','BEANPOLE 빈폴','BLIZZAREDKOREA',
'BMW Korea','Canon Korea','Cass TVC','Chevrolet Korea','CJ','CJ제일제당(CJ Cheiljedang)',
'Coca-Cola Korea','Com2uS COrp','COWAY STORY','Electrolux Korea','Eucerin Korea','Funjejuair',
'GmarketZone','HITEJINRO','Hotels.com APAC','KB국민카드','Kellogg Korea','Korea Samsonite','KT',
'Kuvings','LANEIGE 라네즈 Korea','LG Uplus','LG전자 LG Electronics korea','LG전자 Mobile Library',
'LGCAREAD','Listerinekorea','LOTTE CHILSUNG','LOTTE DUTY FREE','LOTTE RIA','Lottecard',
'MAMONDE 마몽드 KOREA','MINI Korea','ncsoft','NESCAFE Korea','Neutrogena Korea','Nike Korea',
'NIVEA Korea','nongshim','plaync','PlayStation Korea','Reckitt Benckiser Korea','Reebok Korea',
'renaultsamsungM','Samsung Korea','SK telecom','SK-2 korea','SK매직','SK이노베이션','SK하이닉스',
'SNICKERS','Sony Korea','Sulshasoo 설화수','Tylenol Korea']
channel = []
subscribers_list = []
totalview_list = []
videonums_list = []
videoviewsmeans_list = []
joined = []
driver = webdriver.Chrome('./chromedriver') # chrome창을 띄움
driver.implicitly_wait(2)
driver.get("https://www.youtube.com/") # youtube창을 띄움
driver.implicitly_wait(2)
youtube = pd.DataFrame({'channel':[],
'subscribers_list':[],
'totalview_list':[],
'videonums_list':[],
'videoviewsmeans_list':[],
'joined':[]})
# 따로 전처리를 하지않기위해 추출할때 전처리과정을 걸쳐서 추출함.
for i in channels:
search = driver.find_element_by_name("search_query")
search.clear()
search.send_keys(i)
search.submit()
videonums = driver.find_element_by_xpath('//*[@id="video-count"]').text
videonums_list = videonums.strip('동영상 개').replace(',','')
driver.find_element_by_id("avatar-section").click()
subscriber = driver.find_element_by_id("subscriber-count")
if len(subscriber.text) > 0:
subscribers_list = float(subscriber.text.strip('구독자만명'))*10000
else:
subscribers_list = 'NaN'
driver.find_element_by_xpath('//*[@id="tabsContent"]/paper-tab[6]/div').click()
totalviews = driver.find_element_by_xpath('//*[@id="right-column"]/yt-formatted-string[3]').text
totalview_list = totalviews.strip('조회수 회').replace(',','')
try:
videoviewsmeans_list = str(int(totalviews.strip('조회수 ').replace(',','')) / int(videonums.strip('동영상 ').strip('개').replace(',','')))
except:
videoviewsmeans_list = "NaN"
join_date = driver.find_element_by_xpath('//*[@id="right-column"]/yt-formatted-string[2]/span[2]').text
joined = join_date.rstrip('.').replace('. ','/')
insert_data = pd.DataFrame({'channel':[i],
'subscribers_list':[subscribers_list],
'totalview_list':[totalview_list],
'videonums_list':[videonums_list],
'videoviewsmeans_list':[videoviewsmeans_list],
'joined':[joined]})
youtube = youtube.append(insert_data)
youtube.index = range(len(youtube))
# 데이터프레임 엑셀로 저장
youtube2.to_excel(excel_writer = './youtube2.xlsx',
sheet_name = 'data',
header = True,
index = False)
채널에서 뽑아올 정보는 구독자 수, 영상 수, 누적 조회수, 채널 가입일, 영상별 평균 조회수 밖에 없기 때문에
간단하게 코드를 짰다. 우리가 필요한 데이터는 수치상의 데이터였기 때문에 추출할 때부터 전처리를 진행하게끔 코드를 짰다.
(그래서 좀 지저분하게 짰음. )
유튜브 채널 정보는 실시간으로 바뀌기 때문에 우리는 그때그때 크롤링하는 것이 아닌 기준일을 정해두고 그날의 정보를 가지고 분석을 하기로 했다.
그 다음에 계속_
(혹시 코드에 대해 질문이 있으시면 댓글 남겨주시거나 제 인스타로 디엠주셔도 됩니당)