코딩코딩코딩

유튜브(Youtube) 크롤링 - selenium - 3 본문

파이썬/텍스트마이닝

유튜브(Youtube) 크롤링 - selenium - 3

hanshow113 2020. 8. 13. 18:20

이전에 작성했던 셀레니움을 통해 접속, 검색필터 설정 + 영상 정보 크롤링 코드를 합쳐서 작성했습니다.

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import pandas as pd

driver_path = "C:\\Users\\Rectworks\\PycharmProjects\\chromedriver\\chromedriver.exe"
driver = webdriver.Chrome(driver_path)
driver.implicitly_wait(5)  # or bigger second

start_url = "https://www.youtube.com"
driver.get(start_url)
# browser.maximize_window()

driver.find_elements_by_xpath('//*[@id="search-input"]')[0].click()
driver.find_element_by_xpath('//*[@id="search-form"]/div/div/div/div[2]/input').send_keys("장마")
driver.find_element_by_xpath('//*[@id="search-form"]/div/div/div/div[2]/input').send_keys(Keys.RETURN)

# 필터 버튼 클릭
driver.find_element_by_xpath('//*[@id="container"]/ytd-toggle-button-renderer/a').click()

# 필터 기준 - 업로드 날짜 - 오늘
upload_date = driver.find_element_by_xpath('//*[@id="collapse-content"]/ytd-search-filter-group-renderer[1]')
click_list_1 = upload_date.find_elements_by_id("endpoint")
click_list_1[1].click()

# 필터 창이 내려가는 속도에 맞추기 위해서 임의로 sleep한 후에 버튼 클릭
time.sleep(2)
driver.find_element_by_xpath('//*[@id="container"]/ytd-toggle-button-renderer/a').click()

# 필터 기준 - 정렬 기준 - 조회수
sorting_std = driver.find_element_by_xpath('//*[@id="collapse-content"]/ytd-search-filter-group-renderer[5]')
click_list_5 = sorting_std.find_elements_by_id("endpoint")
click_list_5[2].click()
time.sleep(2)

### 필터링 광고창 넘어서 영상창으로 이동
pageidx = 1
for ad in range(5):
    contents = driver.find_element_by_xpath('/html/body/ytd-app/div/ytd-page-manager/ytd-search/div[1]/ytd-two-column-search-results-renderer/div/ytd-section-list-renderer/div[2]/ytd-item-section-renderer['+str(pageidx)+']/div[3]')
    renderer_list = contents.find_elements_by_tag_name("ytd-video-renderer")
    if len(renderer_list) < 2:
        pageidx += 1
    else:
        break
# 필터링하면 상단에 광고가 생기는 경우가 있음.

channel_list = []
title_list = []
viewCnt_list = []
time_list = []

videosNum = len(renderer_list)
print(videosNum)
for video in range(videosNum):
    video_title = renderer_list[video].find_element_by_id("video-title").text
    channel_id = renderer_list[video].find_element_by_id("text").text
    metatxt = renderer_list[video].find_element_by_id("metadata-line").text
    viewCnt = metatxt[:metatxt.find("\n")]
    date = metatxt[metatxt.find("\n")+1:]

    channel_list.append(channel_id)
    time_list.append(date)
    viewCnt_list.append(viewCnt)
    title_list.append(video_title)

youtube_dict = {'채널':channel_list,
              '조회수':viewCnt_list,
              '시간':time_list,
             '제목':title_list}

df = pd.DataFrame(youtube_dict)
df

 

 

이렇게 영상별 메타 정보를 확인할 수 있는데 페이지를 스크롤하는 기능을 더하면 더 많은 정보를 수집할 수 있습니다.

Comments