• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

유튜브 크롤링시 어려움

24.01.17 16:36 작성 조회수 375

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

안녕하세요

유튜브 크롤링 중에 이렇게 코드를 돌리면

 

전립선암의 증상과 진단을 위한 검사는? [AMC 병법]

조회수 0회 날짜 없음

 

모든 결과가 조회수0회 날짜없음으로 가져와집니다ㅠㅠ

어디가 문제일까요?

 

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time
from bs4 import BeautifulSoup

# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

# 불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])

# 브라우저 생성
browser = webdriver.Chrome(options=chrome_options)


url = "https://www.youtube.com/results?search_query=%EC%95%94"

#웹페이지 해당 주소 이동
browser.implicitly_wait(5) #웹페이지가 로드될때까지 5초는 기다린다
browser.maximize_window() #화면 최대화
browser.get(url)

#3번 스크롤하기
scroll_count = 3

i = 1
while True:
    #맨 아래로 스크롤을 내린다.
    browser.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END)

    #스크롤 사이에 페이지 로딩 시간
    time.sleep(2)

    if i == scroll_count:
        break
    i += 1

#selenium - beautifulsoup 연동방법
html = browser.page_source
soup = BeautifulSoup(html, 'html.parser')
infos = soup.select("div.text-wrapper")

for info in infos:
    #원하는 정보 가져오기
    #제목
    title = info.select_one("a#video-title").text
    
    try: 
        #조회수
        views = info.select_one("div#metadata-line > span:nth-child(1)").text

        #날짜
        date = info.select_one("div#metadata-line > span:nth-child(2)").text
    except:
        views = "조회수 0회"
        date = "날짜 없음"

    print(title, views, date)

browser.quit()

답변 2

·

답변을 작성해보세요.

0

안녕하세요 🙂

조회수와 날짜를 가져오는 부분에서 HTML이 조금 업데이트가 있었나 보네요.

 

아래와 같이 코드를 수정하시면 됩니다.

#조회수
views = info.select_one("div#metadata-line > span:nth-of-type(1)").text

#날짜
date = info.select_one("div#metadata-line > span:nth-of-type(2)").text

 

nth-child는 몇번째 자식인지로 선택하는 거고

nth-of-type은 해당 태그들 중에 몇번째인지로 선택하는 겁니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.19

안녕하세요, 인프런 AI 인턴입니다.
sek95041143님, 유튜브 크롤링에 어려움을 겪고 계시군요.

해당 코드를 보았을 때, 유튜브 페이지의 요소 선택자가 변경되었거나 스크립트에 의해 동적으로 로드되는 요소가 제대로 파싱되지 않은 문제일 수 있습니다. 그래서 조회수와 날짜 정보를 정확히 가져오지 못하는 것으로 보입니다. 일단 제가 여러 가지 가능한 오류의 원인을 몇 가지 제시해드리겠습니다.

  1. 유튜브 페이지의 HTML 구조가 바뀌어 기존의 CSS 선택자가 더 이상 유효하지 않을 수 있습니다.

    • 브라우저의 개발자 도구를 사용하여 현재 유튜브 페이지의 올바른 선택자를 찾아보시기 바랍니다.
  2. 유튜브 페이지에는 동적으로 로딩되는 요소가 많은데, 페이지가 완전히 로드되기 전에 크롤링을 시도하면 정보를 올바르게 가져오지 못할 수 있습니다.

    • 각 요소들이 로드될 수 있도록 충분한 대기 시간을 설정하거나, 페이지가 완전히 로드될 때까지 대기하는 방법을 시도해보세요.
  3. 조회수와 날짜 값을 가져오는 부분에서 select_one 메서드를 사용하는 대신 명확한 CSS 선택자를 활용하거나, 해당 요소가 로드 될 때까지 대기하도록 명시적 대기를 구현해보세요.

또한, 크롤링된 결과를 확인하기 위해 print 문으로 결과를 출력하기 전, 실제로 데이터가 있는지 print를 사용하여 중간중간 확인해 보세요. 이는 오류를 발견하고 디버깅하는 데 도움이 될 것입니다.

이러한 사항들을 적용하신 후에도 문제가 해결되지 않는다면, 유튜브의 로딩 방법인 AJAX나 자바스크립트 렌더링에 의해 내용이 동적으로 변하는 것을 감안하여 크롤링 전략을 다시 검토해야 할 수도 있습니다.

참고가 되었길 바라며, 추가적인 문의사항이 있으시면 언제든지 질문해주세요.