如何使用Python的Selenium检测YouTube平台上的广告
YouTube广告检测的可行方案
首先指出你当前代码的核心错误:WebDriverWait的until方法中,EC.presence_of_element_located需要接收定位器元组(比如(By.XPATH, 'xxx')),而不是直接调用driver.find_element_by_xpath,这会导致代码逻辑失效。
以下是几种经过验证的广告检测方法:
方法1:结合广告容器类与跳过按钮定位
YouTube播放广告时,会给页面元素添加特定类名,同时部分广告会出现跳过按钮,结合这两个特征可以提高检测准确率:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def check_ad(): # 检测广告播放状态的容器元素 try: WebDriverWait(driver, 5).until( EC.presence_of_element_located( (By.XPATH, "//div[contains(@class, 'ad-showing') or contains(@class, 'ad-interrupting')]") ) ) print("Ad detected") return True except: # 补充检测跳过按钮(部分广告延迟出现跳过按钮) try: WebDriverWait(driver, 3).until( EC.presence_of_element_located( (By.XPATH, "//button[contains(text(), '跳过广告') or contains(text(), 'Skip Ad')]") ) ) print("Ad detected (skip button present)") return True except: print("No Ad") return False
方法2:通过JavaScript直接获取播放器广告状态
YouTube的内置播放器对象包含广告状态信息,执行JS可以直接读取,这种方法更稳定:
def check_ad_via_js(): try: # 读取播放器的广告播放状态 ad_playing = driver.execute_script(""" const player = document.getElementById('movie_player'); return player && player.getVideoData && player.getVideoData().adPlaying; """) if ad_playing: print("Ad detected via JS") return True except: pass print("No Ad") return False
如果上面的JS代码失效,可以尝试另一种读取方式:
ad_playing = driver.execute_script("return document.querySelector('video').playerInfo?.adInfo?.isAdPlaying || false;")
注意事项
- YouTube的页面元素类名、ID会不定期更新,若检测失效,需要重新定位最新的广告相关元素;
- 检测等待时间建议设置在3-5秒,避免阻塞后续流程;
- 可以同时结合多种检测方法,进一步提升准确率。
内容的提问来源于stack exchange,提问作者Raymond Durr
相关产品推荐
相关产品推荐

