怎么用Python自动点击跳过各大视频播放器的贴片广告
Selenium模拟点击是绕过可跳过广告最可行方案,但仅适用于含“跳过”按钮或“X”关闭按钮的广告;需处理iframe切换、动态元素等待及DOM变化,pyautogui和浏览器扩展因稳定性差不推荐。
用 selenium 模拟点击是最可行的路径,但成功率取决于广告类型
纯贴片广告(即视频开始前几秒的不可跳过广告)基本无法用自动化点击“跳过”,因为“跳过”按钮在广告结束前根本不存在。真正能干预的,是那些带「跳过广告」文字按钮的可跳过广告(常见于 Bilibili、腾讯视频、爱奇艺的部分非会员广告),或播放器右上角的「关闭」、「X」按钮。
必须明确:这不是通用解法,而是针对特定 DOM 结构的临时应对。浏览器驱动、页面加载时机、元素可见性都会直接影响点击是否生效。
-
selenium是目前最稳定的选择;playwright也可行,但部分国产播放器对它的检测更敏感 - 务必使用无头模式(
headless=False)先手动验证流程,否则失败时完全看不到发生了什么 - 不要依赖固定 XPath,优先用
WebDriverWait等待visibility_of_element_located,而非presence_of_element_located - 某些页面会动态插入广告容器(如
div[data-ad]或iframe[id*="ad"]),需先切到 iframe 再找按钮
识别并等待「跳过」按钮出现的关键细节
很多脚本失败,是因为直接用 find_element 查找,而此时按钮还没渲染出来,或者被遮挡。Bilibili 的「跳过广告」按钮通常在倒计时 5 秒后才显示,且 class 名经常变(如 skip-btn、ad-skip、icon-skip)。
推荐策略:
- 监听
document.querySelectorAll('button, a')中包含「跳过」「Skip」「关闭」「Close」文本的元素 - 用
WebDriverWait(driver, 10).until(lambda d: len(d.find_elements(By.XPATH, "//*[contains(text(), '跳过') or contains(text(), 'Skip') or @aria-label='Skip']")) > 0) - 点击前加判断:
if element.is_displayed() and element.is_enabled(): element.click() - 避免点击后立即继续——有些广告点击跳过会触发二次加载,建议
time.sleep(0.8)后再检查视频是否已播放
绕过 iframe 广告容器是多数人卡住的地方
腾讯视频和爱奇艺常把广告嵌在 iframe 里,主页面 DOM 根本找不到「跳过」按钮。不切换上下文,selenium 就像隔着玻璃按屏幕。
实操步骤:
MyMap AI
使用AI将想法转化为图表
- 先定位广告 iframe:
driver.find_element(By.XPATH, "//iframe[contains(@src, 'ad') or contains(@id, 'ad') or @data-ad]") - 用
driver.switch_to.frame(iframe_element)进入上下文 - 再查找按钮(此时按钮就在 iframe 内部 DOM 中)
- 点击完成后,必须
driver.switch_to.default_content()切回来,否则后续操作全失效 - 注意:部分 iframe 是沙箱化的(
sandbox="allow-scripts"),可能禁止脚本访问,这种基本无解
为什么 pyautogui 和浏览器扩展方案不推荐
pyautogui 做图像识别点击(比如找「跳过」文字截图匹配)看似绕过 DOM 限制,但实际非常脆弱:分辨率变化、缩放比例、主题色调整、字体抗锯齿差异都会导致匹配失败;而且一旦窗口失焦或被遮挡就彻底失效。
浏览器扩展(如 Tampermonkey 脚本)理论上更底层,但现代视频站普遍启用 Content-Security-Policy 限制内联脚本,并通过 MutationObserver 监控 DOM 变动,随时移除注入的跳过逻辑。你写的 document.querySelector('.skip-btn').click() 很可能刚执行完就被重置。
所以,除非你只跑固定环境(同一台电脑、固定分辨率、固定浏览器版本、固定网站版本),否则别押注在这两类方案上。
真实场景中,最麻烦的不是写代码,而是每次网站更新后重新抓元素、调等待条件、验证 iframe 是否换名——这活没法一劳永逸。
如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!
猜您喜欢
我要当老祖主线各大Boss攻略
2026-07-03我要当老祖主线各大Boss攻略:主线优先通关不卡星,通用水+土+木,木主C靠闪避回血偷攻防。金剑门用木闪避或火爆发,木魅用金系克制,山膏用高血木或水系,土、水Boss用木系偷取。各系神通功法定制,金系配刀暴发,火系配乐大招,词条优选各属性道胎/圣体。 我要当老祖主线各大Boss攻略 一、主线注意事项 Boss关卡:自选逆天神通强化Boss后挑战。前期优先通关,不用强行打满三 星,避免卡宗门等级,等...
《双点医院:满血痊愈典藏版》即将登陆各大主机平台! 《潜水员戴夫》联动现已加入
2026-06-23世嘉旗下双点工作室宣布将于PlayStation®5/XboxSeriesX|S/NintendoSwitch™ 2平台推出《双点医院:满血痊愈典藏版》,收录了《双点医院》游戏本体及发售以来推出的所有DLC与免费更新内容,为玩家带来最完整的双点医院体验。 作品宣传片: 《双点医院:满血痊愈典藏版》包含以下DLC内容: ·BigFoot(大脚) ·PebberleyIsland(佩博里岛) ·Clo...
《最终幻想7:启示》确认是单一结局 小游戏可跳过
2026-06-08在昨天的夏季游戏节上,SE正式发表《最终幻想7:重制版》三部曲完结篇《最终幻想7:启示》,2027年春季同步在PS5、XboxSeries X|S、Switch2和PC(Windows/Steam/ Epic)同步推出。 在《最终幻想7:启示》中,克劳德一行人为了星球的未来,将展开与赛菲罗斯的最终决战。足以毁灭星球的「陨石」带来威胁,巨大的星球守护者「兵器」即将觉醒,战火也愈发激烈。在迈向终焉的世...
如何修复Python aiohttp请求时出现的ClientPayloadError?
2026-06-04ClientPayloadError表明服务端提前关闭连接,非客户端代码错误;常见于服务端超时、拒绝大响应或代理截断,需通过抓包、检查响应头、服务端日志及添加读取超时和异常处理来定位解决。 ClientPayloadError通常意味着服务端提前关闭了连接 这个错误不是客户端代码写错了,而是aiohttp在读取响应体时发现服务端已经断开了连接。常见于服务端超时、主动拒绝大响应、或代理/网关(如Ng...
如何使用Python监控服务器CPU温度并邮件告警_通过psutil模块读取系统信息
2026-06-04psutil无法直接读取CPU温度,因其依赖系统硬件接口且Linux需lm_sensors支持、Windows/macOS完全不支持;可靠方式是用subprocess调用sensors命令解析输出,并配合邮件告警与健壮性设计。 psutil本身不提供CPU温度读取功能——它无法直接获取温度传感器数据,强行调用psutil.sensors_temperatures()在多数Linux发行版(尤其是无...
如何在Python中验证文件的MD5校验和以确保数据完整性?
2026-06-04必须分块读取,推荐8192或65536字节块大小,以rb模式打开文件,循环调用update(),最后用hexdigest()获取32位小写十六进制字符串;校验时需strip().lower()统一格式并做长度校验。 用hashlib.md5()读取文件并计算校验和 直接调用hashlib.md5()并传入整个文件内容(比如md5.update(f.read()))在大文件上会爆内存。必须分块读取,...
怎样在Python Tkinter中使用线程池处理高并发的GUI数据更新?
2026-06-04不能直接用ThreadPoolExecutor更新Tkinter控件,因为Tkinter的Tcl解释器只允许主线程操作UI;子线程(包括线程池中的工作线程)调用widget方法会引发TclError或卡死;必须通过queue.Queue+root.after()将结果安全传回主线程更新。 为什么不能直接用concurrent.futures.ThreadPoolExecutor更新Tkinter控...
如何在Python 3中正确判断一个对象是否为某个类的实例?
2026-06-04应优先使用isinstance()而非type()做类型判断,因isinstance()遵循MRO、支持继承与ABC,体现鸭子类型哲学;type()仅判别直接类型,适用极少数需严格身份校验的场景。 用isinstance()而不是type() 直接比较type(obj)==SomeClass在绝大多数场景下是错的——它无法识别子类实例。比如isinstance(42,int)返回True,但typ...
为什么Python Django默认使用PBKDF2算法进行密码哈希?
2026-06-04Django默认使用PBKDF2而非Argon2或bcrypt,因其零依赖、NIST合规、迭代与salt可扩展,且默认26万次迭代兼顾安全与性能;make_password和check_password均动态读取PASSWORD_HASHERS[0],支持渐进式算法迁移。 PBKDF2是Django默认密码哈希算法,因为它在安全性、兼容性与可配置性之间取得了最务实的平衡。 为什么不是更“新”的Ar...
如何在Python中自定义NumPy的打印格式以方便调试?
2026-06-04np.set_printoptions()可直接控制NumPy数组显示格式;默认格式因小数位不一致、科学计数法混用及自动截断而影响调试效率;关键参数需协同设置,如precision控制有效位数、suppress禁用科学计数法、threshold避免省略、linewidth防换行混乱、floatmode='fixed'统一小数位;调试时应按目标切换组合,并注意全局生效与及时还原。 直接用np.set...
