본문 바로가기
Programming/Python

파이썬 유튜브 크롤링 셀레니움 2편

by 코딩하는 금융인 2021. 6. 22.

파이썬 Selenium 유튜브(Youtube) 크롤링 2

목표 : 파이썬 자동화 모듈 selenium의 webdriver를 사용하여 유튜브에 원하는 검색어를 던져 나오는 영상 데이터를 대량 및 자동으로 수집하기

for문 + 셀레니움으로  동영상에 대한 썸네일, 제목 등 동적인 Data 자동 수집


▶ 유튜브 html Check!

css_selector로 데이터를 수집하기

* html을 분석하면, 각 영상들이 ytd-video-renderer box 형태로 들어가 있음 확인.

 

css_selector 예시

 

하지만, 우리가 원하는 검색어 종류는 검색어 : 삼성전자에 대한 관련 영상이므로 #contents로 된 box를 잡아야함!

 

크롤링 코드

html을 분석하여 css selector 타점을 잡고 또 이에 대한 속성, 텍스트를 원하는 데이터 종류에 맞게 뽑아내는 작업을 코드에 담았습니다.

 

앞서 모듈을 import하고 data 파일 다운로드 등의 과정부터 실제 Selenium으로 크롤링하여 결과 엑셀 파일로 저장하는 과정까지 담은 코드입니다.

# 데이터 처리
import pandas as pd
from pandas import DataFrame
import openpyxl

# selenium
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager # webdriver-manager 패키지 다운로드
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys

# 시간 명시
from tqdm import tqdm
import time

# 오류 확인
import traceback

## Webdirver option 설정
options = webdriver.ChromeOptions()
# options.add_argument('headless') # 크롬 띄우는 창 없애기
options.add_argument('window-size=1920x1080') # 크롬드라이버 창크기
options.add_argument("disable-gpu") #그래픽 성능 낮춰서 크롤링 성능 쪼금 높이기
options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36") # 네트워크 설정
options.add_argument("lang=ko_KR") # 사이트 주언어
driver = webdriver.Chrome(ChromeDriverManager().install(),chrome_options=options)

# 엑셀에서 검색어 추출
df = pd.read_excel("C:/Users/코딩하는 금융인/Desktop/sample data.xlsx")  # 경로 바꿔주셔야돼요!
data_list = []

# Main Code
for idx, row in tqdm(df.iterrows(), desc="돌리는중"):
    cd_idx = row['cd_idx']
    search_name = row['cop_youtube_search']
    print(search_name)
    try:
        youtubeUrl = (f"https://www.youtube.com/results?search_query={search_name}")
        # url에 &sp=QgIIAQ%253D%253D : 검색 입력어 그대로 검색.
        # 유튜브는 검색이 이상하면 자동으로 검색 조정해줌.
        driver.get(youtubeUrl)
        time.sleep(0.1)
        # driver.execute_script("window.scrollTo(0, 80000)")
        no_of_pagedowns = 5
        elem = driver.find_element_by_tag_name("body")
        # print("Scrolling Down!")
        while no_of_pagedowns:
            # print(10 - no_of_pagedowns, "th Scroll")
            elem.send_keys(Keys.PAGE_DOWN)
            time.sleep(0.5)
            no_of_pagedowns -= 1
        time.sleep(5) #sleep을 통해 Robot Error 해결.
        num = 0
        box_list = driver.find_elements_by_css_selector("#contents > ytd-video-renderer")
        # 검색결과 미존재 통과
        '''
        if box_list == None:
            print("there is no search result!")
         '''
        for box in box_list:
            title = box.find_element_by_css_selector('#video-title')
            link = title.get_attribute("href")
            title_name = box.find_element_by_css_selector('#video-title').text
            img_ = box.find_element_by_css_selector('#img')
            img = img_.get_attribute('src')
            name = box.find_element_by_css_selector('#text > a').text
            duration = box.find_element_by_css_selector('#overlays > ytd-thumbnail-overlay-time-status-renderer > span').text
            regdate_ment = box.find_element_by_css_selector('#metadata-line > span:nth-child(2)').text
            viewcount = box.find_element_by_css_selector('#metadata-line > span:nth-child(1)').text

            data = {"cd_idx": cd_idx, 'cop_youtube_search': search_name, "link": link, "title_name": title_name,
                    "title_text": title_text, "image": img, "name": name,
                    "duration": duration, "regdate_ment": regdate_ment, "viewcount": viewcount}
            data_list.append(data)
            num += 1
            if (num == 10):
                break
    # 중간 검색어 오류 시 비상 저장
    except:
        print(idx)
        result_df = pd.DataFrame(data_list,columns=['cd_idx', 'cop_youtube_search', 'link', 'title_name', 'image','name',
                                                    'duration', 'regdate_ment', 'viewcount'])
        result_df.to_excel(f'C:/Users/코딩하는 금융인/Desktop/result data.xlsx', index=False)  # 경로 바꿔주셔야 돼요.
        # driver.close()

result_df = pd.DataFrame(data_list,columns=['cd_idx', 'cop_youtube_search', 'link', 'title_name', 'image','name',
                                                    'duration', 'regdate_ment', 'viewcount'])
result_df.to_excel(f'C:/Users/코딩하는 금융인/Desktop/result data.xlsx', index=False)

 

한 가지 꿀팁을 드리자면, 반복문으로 데이터를 저장하는 작업 시 빈 리스트 ( data_list )를 만들어 저장되는 데이터 딕셔너리를 append 해주는 방식으로 만들면 나중에 DataFrame으로 데이터를 작업할 때도 유용합니다.

 

결과 예시

검색명 link title_name image 영상길이 업로드 시기 조회수
삼성전자 https://www.youtube.com/watch?v=MrS8JmJQGYo [여의도튜브] ‘中 혼쭐’ 멍석 깐 英 韓엔 대형선물 선뜻 “유럽 1위 맡기겠다” /머니투데이방송 https://i.ytimg.com/vi/MrS8JmJQGYo/hqdefault.jpg?sqp=-oaymwEcCOADEI4CSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDYrVL18OSj_Uwp4hWs2Z7a284neg 2:21 4일 전 조회수 17만회
삼성전자 https://www.youtube.com/watch?v=I7-71kqzE20 [730 정보회의] 삼성전자 실망매도기사 노이즈 / 730 정보회의 / 매일경제TV https://i.ytimg.com/vi/I7-71kqzE20/hqdefault.jpg?sqp=-oaymwEcCOADEI4CSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAKCOIrdt1wCBravF0T26ei8XXjTQ 22:49 2일 전 조회수 1만회
SK하이닉스 https://www.youtube.com/watch?v=8lsR4QnvMr4 2021 SK하이닉스 신입사원 채용 면접 현장 ‼대공개‼ https://i.ytimg.com/vi/8lsR4QnvMr4/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAy2OJ-hULLuJ-0qjKGxmcm55_OUw 3:22 2주 전 조회수 4.2천회
SK하이닉스 https://www.youtube.com/watch?v=AdT_eC-vOng SK하이닉스, NAVER, 기아, SK이노베이션_황해수의 주력 종목 (20210617) https://i.ytimg.com/vi/AdT_eC-vOng/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCJOhvu1o0fRJanjNYKq3Paj7fDww 2:52 3일 전 조회수 2.4천회
NAVER https://www.youtube.com/watch?v=588pS2wLv48 [SEVENTEEN] 세븐틴 - 'Ready to love' (4K) Live Performance | #OUTNOW https://i.ytimg.com/vi/588pS2wLv48/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDAlFt59O4GEct0kbaC-5zvLjFYjQ 3:21 16시간 전 조회수 29만회
NAVER https://www.youtube.com/watch?v=_rns4mK_YA4 [930 투자전략실] 다시 뛰는 성장주 그 종목을 잡아라 - NAVER·카카오·파버나인 / 매일경제TV https://i.ytimg.com/vi/_rns4mK_YA4/hqdefault.jpg?sqp=-oaymwEcCOADEI4CSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBSeiRiiyJa72XZOkThWIfYosvTnw 30:29:00 6일 전 조회수 2.7만회
카카오 https://www.youtube.com/watch?v=VLl0T51qRFs 카카오의 덩치가 3위까지 커진 이유는? https://i.ytimg.com/vi/VLl0T51qRFs/hqdefault.jpg?sqp=-oaymwEcCOADEI4CSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLD4FO0v8CvFIeptkPFpbHF93MqATQ 16:50 23시간 전 조회수 2.4만회
카카오 https://www.youtube.com/watch?v=7fDY-PeMC94 [39금] 카카오 지금이라도 살까? /카카오/네이버/삼성전자/바디텍메드/덱스터/테크윙/코미코/한국금융지주/CJENM/하이브/와이지엔터테인먼트/최임화의39금증권방송/매일경제TV https://i.ytimg.com/vi/7fDY-PeMC94/hqdefault.jpg?sqp=-oaymwEcCOADEI4CSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLD-R717L0VYbQehpanUlg5Koag7Dg 34:36:00 1일 전 조회수 7.5만회
····· ····· ····· ····· ····· ····· ·····

 

 마무리

앞서 말했듯이 오로지 셀레니움으로 작성한 코드는 시간이 오래 걸린다는 치명적인 단점이 있으므로,

만약 웹페이지 수집이 필요하다면, page_source를 셀레니움으로 가져와서 bs4로 파싱하는 작업이 더 효율적일 수 있습니다.

 

Selenium은 마우스 클릭 등 단순 작업을 자동화시켜 도와준다는 점에서 큰 장점을 가지고 있는 모듈입니다. 크롤링 작업뿐만 아니라 다양한 자동화 작업에 활용될 수 있어 공부해두시는 걸 추천드립니다.

반응형

댓글