使用Selenium获取网站视频链接的方法及问题求助——针对https://www.ofw.su/family-feud-july-29-2022站点
解决Selenium无法获取视频链接的问题,附通用获取方法
首先,你的代码拿不到视频链接,大概率是这几个原因在搞鬼:
- 绝对XPath
/html/body/div/div[2]/div[3]/video太脆弱了,页面结构稍有变动就会失效 - 固定的
time.sleep(2)可能不够,视频元素还没加载完成你就去查找了 - 视频可能是通过JavaScript动态注入的,初始状态下
src属性是空的,或者链接被存在其他属性里(比如data-src) - 视频说不定嵌套在iframe中,你直接查找自然找不到元素
第一步:修改元素定位与等待逻辑
先把绝对XPath换成更稳定的相对定位,同时用显式等待代替固定sleep,确保元素加载完成后再操作:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def get_video_link(link): CHROMEDRIVER_PATH = 'chromedriver.exe' options = webdriver.ChromeOptions() options.add_argument("user-data-dir=E:\\profile") options.add_argument("--disable-notifications") options.add_experimental_option('excludeSwitches', ['enable-logging']) driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, options=options) driver.get(link) try: # 显式等待视频元素加载,最长等待10秒 video_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "video")) ) # 先尝试获取src,如果为空,再检查data-src等常见存储链接的属性 video_url = video_element.get_attribute('src') if not video_url: video_url = video_element.get_attribute('data-src') if not video_url: video_url = video_element.get_attribute('data-video') print("视频链接:", video_url) return video_url except Exception as e: print("获取视频链接失败:", str(e)) return None finally: driver.quit() link = "https://www.ofw.su/family-feud-july-29-2022" get_video_link(link)
第二步:检查是否存在iframe嵌套
如果上面的代码还是找不到视频,打开浏览器开发者工具(F12),看看视频元素是不是被包裹在<iframe>标签里。如果是,得先切换到iframe才能查找:
# 在获取video元素之前,先切换到iframe # 这里可以根据实际情况用id、class等定位iframe,示例用标签名 iframe = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "iframe")) ) driver.switch_to.frame(iframe) # 之后再查找video元素 video_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "video")) )
通用获取视频链接的步骤
用Selenium爬取网站视频链接,通常遵循以下流程:
- 先查页面结构:用开发者工具确认视频元素的位置,是否在iframe中,以及真实链接存在哪个属性里(src/data-src等)
- 用显式等待代替固定sleep:永远优先用
WebDriverWait,避免元素未加载完成导致的定位失败 - 处理动态加载的情况:有些视频需要点击播放按钮才会加载真实链接,这时候要先模拟点击:
play_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CLASS_NAME, "play-btn")) ) play_button.click() # 给一点时间让视频链接加载 time.sleep(1) video_url = video_element.get_attribute('src') - 查网络请求兜底:如果Selenium始终拿不到,打开浏览器网络面板,筛选
Media类型,找到视频的请求URL,直接用requests库请求(记得带上正确的请求头,比如Referer、User-Agent,避免被防盗链拦截)
内容的提问来源于stack exchange,提问作者Phan Trọng Phúc
相关产品推荐
相关产品推荐

