使用Selenium获取YouTube缩略图src链接失败求助
问题解决:Selenium获取YouTube频道视频缩略图失败
代码中的核心问题
- 错误调用
get_attribute:driver.find_elements()返回的是元素列表,不能直接对整个列表调用.get_attribute(),必须遍历每个元素单独获取属性。 - YouTube懒加载机制:页面滚动加载的视频缩略图采用懒加载策略,初始时
src属性可能为空,真实图片链接存储在data-src属性中,需要优先读取该属性。 - 数据匹配风险:直接
zip多个独立元素列表时,若列表长度不一致会导致数据错位,需确保每个视频对应的四个元素一一对应。
修正后的代码
import time import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://www.youtube.com/@MrBeast/videos") SCROLL_PAUSE_TIME = 3 last_height = driver.execute_script("return document.documentElement.scrollHeight") n = 0 while n < 4: # 滚动到当前页面底部 driver.execute_script("window.scrollTo(0, arguments[0]);", last_height) time.sleep(SCROLL_PAUSE_TIME) new_height = driver.execute_script("return document.documentElement.scrollHeight") if new_height == last_height: break last_height = new_height n += 1 # 获取所有视频元素容器,确保每个视频的相关元素对应 video_containers = driver.find_elements(By.ID, "dismissible") data = [] for container in video_containers: # 从每个容器内提取对应元素 title = container.find_element(By.ID, "video-title").text views = container.find_element(By.XPATH, './/*[@id="metadata-line"]/span[1]').text date = container.find_element(By.XPATH, './/*[@id="metadata-line"]/span[2]').text # 优先读取data-src,若不存在再取src thumbnail_img = container.find_element(By.XPATH, './/*[@id="thumbnail"]/yt-image/img') thumbnail_url = thumbnail_img.get_attribute("data-src") or thumbnail_img.get_attribute("src") data.append([title, views, date, thumbnail_url]) df = pd.DataFrame(data, columns=['Title', 'Views', 'Date', 'Thumbnail URL']) df.to_csv('MrBeastThumbnails.csv', index=False) driver.quit()
关键改动说明
- 通过视频容器统一获取元素:先定位每个视频的外层容器
dismissible,再从容器内查找子元素,彻底避免不同列表长度导致的数据错位问题。 - 兼容懒加载的缩略图属性:先尝试获取
data-src,如果该属性不存在再回退到src,确保能拿到真实的图片链接。 - 遍历容器而非多个独立列表:逐个处理每个视频容器,保证每个视频的标题、播放量、日期、缩略图一一对应。
内容的提问来源于stack exchange,提问作者Wertubise
相关产品推荐
相关产品推荐

