파이썬 Selenium 유튜브(Youtube) 크롤링 2
목표 : 파이썬 자동화 모듈 selenium의 webdriver를 사용하여 유튜브에 원하는 검색어를 던져 나오는 영상 데이터를 대량 및 자동으로 수집하기
for문 + 셀레니움으로 동영상에 대한 썸네일, 제목 등 동적인 Data 자동 수집
▶ 유튜브 html Check!
css_selector로 데이터를 수집하기
* html을 분석하면, 각 영상들이 ytd-video-renderer box 형태로 들어가 있음 확인.
하지만, 우리가 원하는 검색어 종류는 검색어 : 삼성전자에 대한 관련 영상이므로 #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으로 데이터를 작업할 때도 유용합니다.
▶ 결과 예시
▶ 마무리
앞서 말했듯이 오로지 셀레니움으로 작성한 코드는 시간이 오래 걸린다는 치명적인 단점이 있으므로,
만약 웹페이지 수집이 필요하다면, page_source를 셀레니움으로 가져와서 bs4로 파싱하는 작업이 더 효율적일 수 있습니다.
Selenium은 마우스 클릭 등 단순 작업을 자동화시켜 도와준다는 점에서 큰 장점을 가지고 있는 모듈입니다. 크롤링 작업뿐만 아니라 다양한 자동화 작업에 활용될 수 있어 공부해두시는 걸 추천드립니다.
'Programming > Python' 카테고리의 다른 글
파이썬 한글 자음 모음 조합하기 (NLP) (4) | 2021.07.17 |
---|---|
파이썬 영어 한글 발음으로 변환하기 (콩글리시) (4) | 2021.07.05 |
파이썬 유튜브 크롤링 셀레니움 1편 (5) | 2021.06.14 |
파이썬 collections 컨테이너형 자료 모듈 (0) | 2021.06.13 |
[파이썬] 웹 url 호출하기 requests post/get (1) | 2021.06.09 |
댓글