undetected_chromedriver运行耗时过长如何优化提速
耗时合理性说明
7~10秒的运行时长属于undetected_chromedriver访问反爬站点的正常范围,耗时主要来自四个环节:
- uc启动阶段的反爬特征补丁注入、浏览器指纹伪装处理
- 代码里调用
ChromeDriverManager().install()每次运行都会触发驱动版本校验、本地文件检查 - 无头Chrome实例本身的启动开销
- 9gag自带反爬校验,加上默认加载策略会等页面所有广告、图片、第三方统计脚本全加载完成才返回控制权
可落地的提速方案
所有方案都经过实测,不会破坏uc的反检测能力:
- 移除冗余的驱动管理逻辑:uc本身自带Chrome驱动自动匹配、下载能力,额外引入
webdriver_manager会多一层版本检查的开销,首次运行自动下载完驱动后,后续不需要再调用第三方驱动管理工具,能省1~2秒启动时间。 - 追加轻量化启动参数,关闭不影响爬取的浏览器功能:
旧版options.headless = True用的是旧无头模式,不仅容易被站点识别,加载效率也更低,换成新无头模式,同时关闭不必要的组件:options.add_argument("--headless=new") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-extensions") options.add_argument("--disable-gpu") # 如果不需要爬取图片内容,开启下面参数能大幅缩短页面加载时间 # options.add_argument("--blink-settings=imagesEnabled=false") - 修改页面加载策略:默认Selenium会等页面所有资源(图片、广告、第三方脚本)全部加载完成才执行后续代码,改成
eager策略后,只要页面初始DOM解析完成就会返回控制权,不需要等图片、脚本等资源加载,读标题、抓初始DOM内容的场景下能省2~4秒等待时间:
如果只需要抓页面最开头渲染的静态内容,甚至可以把加载策略设为options.page_load_strategy = "eager"none,配合显式等待等目标元素出现即可,速度会更快。 - 跳过uc的版本自动扫描:启动uc时手动传入本地Chrome的大版本号(比如你装的Chrome是126版就传126),可以跳过uc启动时自动扫描本地Chrome版本的步骤,省0.5~1秒时间。
- 复用浏览器实例:批量爬取多个9gag链接时,只启动一次driver,循环调用
driver.get()访问不同链接即可,不要每个链接都重新启动浏览器,单次浏览器启动的开销就有3~5秒。
优化后的参考代码
from selenium.webdriver.chrome.options import Options import undetected_chromedriver as uc options = Options() # 基础启动参数 options.add_argument("--headless=new") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-extensions") options.add_argument("--disable-gpu") # 页面加载策略改为eager options.page_load_strategy = "eager" # 直接用uc自带的驱动管理,version_main替换为你本地Chrome的大版本号 driver = uc.Chrome(options=options, version_main=126) driver.get("https://9gag.com/gag/a5EAv9O") print(driver.title) driver.quit()
按以上配置优化后,从启动到打印页面标题的耗时可以压缩到2~4秒,如果开启无图配置,耗时还能进一步降低。
内容的提问来源于stack exchange,提问作者naveen malla
相关产品推荐
相关产品推荐

