Selenium与Selenium-wire为Webdriver添加请求头的方法区别
问题确认
你的认知基本正确,两者修改WebDriver请求头的常规实现路径如下:
- Selenium-wire:核心通过
request_interceptor请求拦截机制实现,支持运行时动态修改任意请求的请求头,可针对不同请求定制不同头信息,覆盖所有页面发起的请求 - 原生Selenium:本身没有内置运行时动态修改请求头的能力,静态全局固定头的最简易实现方式是通过
ChromeOptions传入浏览器启动参数,但该方案局限性很强
示例代码修正
你贴的两段示例代码都存在影响运行/生效的错误,修正后如下:
Selenium-wire 实现(修正版)
原代码存在两个问题:
- 拦截函数入参命名为
req,函数内部却使用request调用,变量不匹配会抛NameError - 请求头字段名拼写错误,标准字段是
Referer而非Refers,拼写错误会导致修改完全不生效
from seleniumwire import webdriver driver = webdriver.Chrome() def intercept(req): req.headers['Referer'] = 'https://www.google.com/' driver.request_interceptor = intercept driver.get('目标访问URL')
该方案会拦截所有浏览器发起的请求(包含页面导航、静态资源加载、接口调用等),统一修改Referer头,也可在拦截函数内根据请求URL做差异化头设置。
原生Selenium ChromeOptions实现(修正版)
原代码存在两个问题:
- 同样存在
Referer拼写错误,且Chrome启动参数需要加--前缀 - 该方案仅对浏览器启动后第一个导航请求生效,页面内的资源请求、异步接口请求、后续跳转请求都不会携带设置的Referer,无法实现全局头修改
from selenium import webdriver opt = webdriver.ChromeOptions() referer_val = 'https://www.google.com/' opt.add_argument(f'--referer={referer_val}') driver = webdriver.Chrome(options=opt)
如果需要用原生Selenium实现全局动态请求头修改,不需要依赖第三方库的话,可以直接调用Chrome DevTools Protocol接口实现,效果和Selenium-wire接近。
内容的提问来源于stack exchange,提问作者123456
相关产品推荐
相关产品推荐

