인프런 커뮤니티 질문&답변

정경민님의 프로필 이미지
정경민

작성한 질문수

[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

전처리전 강의인데 조회수와 날짜가 출력되지 않습니다.

작성

·

170

0

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

from bs4 import BeautifulSoup

import time

import pyautogui

import openpyxl

# 검색어 입력

keyword = pyautogui.prompt("검색어를 입력하세요")

#엑셀 생성

wb = openpyxl.Workbook()

ws = wb.create_sheet(keyword)

ws.append(['번호','제목','조회수', '날짜'])

url = f"https://www.youtube.com/results?search_query={keyword}"

browser = webdriver.Chrome("c:/chromedriver.exe" )

browser.implicitly_wait(10)

browser.maximize_window()

browser.get(url)

# 7번 스크롤하기

scroll_count=7

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 i, info in enumerate(infos, 1):

# 원하는 정보 가져오기

# 제목

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)

ws.append([i, title, views, date])

wb.save(f'07_유투브_크롤링/{keyword}.xlsx')

 

답변 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 인턴입니다.

조회수와 날짜가 출력되지 않는 문제에 대해 당면하신 것 같네요. 제공해주신 코드를 보니 조회수와 날짜를 가져오는 부분에서 CSS 선택자가 유튜브 페이지의 현재 구조와 일치하지 않거나 업데이트로 인해 변경되었을 수도 있어 보입니다. 유튜브의 HTML 구조는 자주 변경되므로, 지금 사용하고 있는 선택자가 여전히 유효한지 웹페이지의 요소 검사를 통해 확인해보셔야 할 것 같습니다.

# 조회수와 날짜 선택자 확인
views = info.select_one("div#metadata-line>span:nth-child(1)").text
date = info.select_one("div#metadata-line>span:nth-child(2)").text

만약 위 코드의 선택자가 현재 유튜브의 구조와 다를 경우, 올바른 선택자로 수정해야 합니다.

또한, 정보를 추출할 때 요소가 존재하지 않을 수 있으니 각 요소의 존재 유무를 확인하고 예외 처리하는 부분을 좀 더 견고하게 작성하는 것이 좋습니다.

코드 관련 오류를 해결해도 문제가 지속된다면 웹페이지의 로딩 시간을 좀 더 길게 가져갈 필요가 있을 수 있습니다. 너무 짧은 로딩 시간은 페이지가 완전히 로드되기 전에 코드가 실행되어 필요한 데이터를 불러오지 못할 수 있습니다.

추가로, 개발하신 환경에서 HTML 구조를 재검토하실 수 있도록 유튜브 검색 페이지와 웹페이지 요소를 검사하는 방법을 숙지하실 필요가 있으니 관련 자료를 찾아보시는 것도 좋겠습니다.

만약 여전히 문제를 해결하기 어렵다면 질문자님의 환경에서 코드의 실행 결과와 함께 질문을 다시 주시면 더 자세한 답변을 드릴 수 있을 것 같습니다.

정경민님의 프로필 이미지
정경민

작성한 질문수

질문하기