Selenium默认加载所有资源以模拟真实用户行为,但图片请求占比高且常非必需;推荐用CDP的Network.setBlockedURLs拦截主流图片格式,需在driver.get前调用,拦截后DOM不变但图片属性返回0。

为什么Selenium默认会加载所有资源(包括图片)
Selenium 启动的浏览器实例默认行为和真实用户一致,会完整请求 HTML、CSS、JS、图片、字体、iframe 等全部资源。这对爬取渲染后页面是必要的,但也会拖慢速度、增加带宽消耗、暴露更多请求指纹。图片通常占页面总请求数 60% 以上,且多数爬虫场景根本不需要它们——比如只抓商品标题、价格、描述文本。
用Chrome DevTools Protocol(CDP)拦截图片请求最可靠
直接禁用图片(如 chrome_options.add_argument('--blink-settings=imagesEnabled=false'))在新版 Chrome + Selenium 4+ 中基本失效,因为该 flag 已被弃用或不生效;更稳定的方式是通过 CDP 的 Network.setBlockedURLs 或 Network.setRequestInterception 动态拦截。推荐前者,简单、低侵入、兼容性好。
- 必须在
driver初始化后、访问任何页面前调用,否则拦截规则不生效 - 拦截目标写成
['*.png', '*.jpg', '*.jpeg', '*.gif', '*.webp', '*.svg'],注意通配符语法是 CDP 要求的 glob 形式,不是正则 - 拦截后图片请求会直接返回空响应(HTTP 200 + 空 body),不会触发 404 或网络错误,页面 DOM 不变,但
<img>标签 src 仍存在
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
<p>options = Options()
options.add_argument('--headless') # 可选
driver = webdriver.Chrome(options=options)</p><h1>启用 CDP 并设置拦截规则(关键步骤)</h1><p>driver.execute_cdp_cmd('Network.setBlockedURLs', {
'urls': ['<em>.png', '</em>.jpg', '<em>.jpeg', '</em>.gif', '<em>.webp', '</em>.svg']
})</p><p>driver.get('<a href="https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635">https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635</a>')</p><h1>此时页面加载中,图片请求已被静默丢弃</h1>拦截后要注意哪些 DOM 和渲染异常
虽然图片不下载,但浏览器仍会解析 <img> 标签、计算占位尺寸、触发 onerror 事件(如果写了)、甚至影响 CSS Grid/Flex 布局。如果你后续要截图或等元素可见,可能遇到意外行为。
立即学习“Python免费学习笔记(深入)”;
-
driver.find_element(By.TAG_NAME, 'img')仍能定位到元素,但.get_attribute('naturalWidth')返回 0,.size可能为{'height': 0, 'width': 0} - 若页面 JS 依赖图片加载完成才显示按钮(如
img.onload = () => btn.style.display = 'block'),该按钮将永远不出现 - 使用
WebDriverWait(driver, 5).until(EC.visibility_of_element_located(...))时,避免等待 img 元素本身是否“可见”,改用其父容器或文本节点
想彻底禁用图片+图标+字体?得组合多种 CDP 设置
仅靠 setBlockedURLs 无法覆盖所有资源类型。例如 favicon.ico、woff2 字体、data:image/svg+xml 内联图,它们不匹配后缀规则。这时需要补充:
- 禁用 favicon:加
options.add_argument('--disable-favicons') - 禁用字体:CDP 中暂无标准方式,但可配合
--font-render-hinting=none减少字体请求(效果有限) - 过滤 data: 协议:把
'data:*'加入setBlockedURLs列表(注意部分浏览器对 data: 拦截支持不稳定) - 真正激进的做法:用
Network.setRequestInterception+ 自定义判断逻辑,但性能开销大,且需手动 continue/abort 每个请求,容易卡死
实际项目中,优先用 setBlockedURLs 拦掉主流图片格式,再根据具体页面 Network 面板观察漏网请求,针对性追加规则。没有一劳永逸的“全资源屏蔽”开关,每次换目标站都得微调。


















