Data Engineering/Crawling

[Crawling] YouTube 동영상 목록 크롤링

YSY^ 2020. 8. 5. 17:49

이번 포스팅에서는 유튜브 목록을 크롤링해보겠다.

 

유튜브의 특징은 스크롤바를 끝까지 내리면 밑 부분이 로딩이 된다.

처음부터 모든것을 굳이 가지고 올 필요가 없기 때문에 먼저 일부만 가지고 오고 나중에 사용자가 요청하면 그때 읽어오는 원리인 것이다.

밑 부분이 로딩되고 있다.
추가로 동영상들이 로드되었다.

물론 끝이 없는건아니다. 끝은 있다.

한 20번정도 내려가면 끝까지 내려갈 수 있다.

따라서 YouTube 동영상목록을 가지고 오려면 먼저 스크롤을 끝까지 내린 다음에 가지고 와야한다.

이 스크롤을 내리는데 Selenium 을 쓴다.

 

셀레늄을 이용한 무한 스크롤

  • execute_script('javascript')
    • 웹에서 자바스크립트 실행
    • 자바스크립트 코드가 결과를 만들어냄
  • javascript method
    • window.scrollTo(width, height):스크롤바 이동
    • document.documentElement.scrollHeigh : document 높이

#크롬 드라이버 실행

from selenium.webdriver import Chrome
url = 'https://www.youtube.com/'
driver = Chrome()
driver.get(url)

#웹의 높이 반환

scroll_pane_height = driver.execute_script('return document.documentElement.scrollHeight')

스크롤바 내리기

while True:
    # 스크롤바를 스크롤패인 높이만큼 이동
    driver.execute_script('window.scrollTo(0,document.documentElement.scrollHeight)')
    # 밑에 붙일 내용을 요청해서 화면을 만들때까지 시간차를 둔다.
    time.sleep(1)
    new_scroll_pane_height = driver.execute_script('return document.documentElement.scrollHeight')
    print(scroll_pane_height,new_scroll_pane_height)
    if scroll_pane_height == new_scroll_pane_height:
        break
    scroll_pane_height = new_scroll_pane_height

목록 제목과 동영상링크 가져오기

from bs4 import BeautifulSoup
from urllib import parse

soup = BeautifulSoup(driver.page_source)
a_list = soup.select('div#contents div#content a#video-title-link')
result = []
for a_tag in a_list:
    link = parse.urljoin(url,a_tag.get('href'))
    title = a_tag.text
    result.append([link,title])

 

728x90
반응형