如何在Geckodriver中使用Selenium修改请求头?
嘿,我之前刚好踩过这个坑!你用Python 3.6.5 + Geckodriver想改请求头,又遇到扩展不兼容的问题,这几个方案应该能帮到你:
方案1:用Firefox DevTools Protocol(CDP)直接修改
现在大部分新版本的Geckodriver和Firefox(一般Firefox 79+)都支持CDP协议,你可以直接通过Selenium的execute_cdp_cmd方法来设置自定义请求头,不用依赖扩展。
代码示例:
from selenium import webdriver from selenium.webdriver.firefox.options import Options # 初始化Firefox选项 options = Options() # 如果需要无头模式可以加上这行:options.add_argument("--headless") # 启动浏览器,记得替换成你的geckodriver路径 driver = webdriver.Firefox(options=options, executable_path="/path/to/your/geckodriver") # 定义你要修改/添加的请求头 custom_headers = { "User-Agent": "MyCustomUA/1.0 (Windows NT 10.0; Win64; x64)", "X-My-Custom-Header": "HelloFromGeckodriver" } # 调用CDP命令设置额外HTTP头 driver.execute_cdp_cmd('Network.setExtraHTTPHeaders', {'headers': custom_headers}) # 测试一下,访问httpbin可以直接看到请求头 driver.get("https://httpbin.org/headers")
这个方法的好处是简单直接,能支持自定义头,不过要确保你的Geckodriver和Firefox版本匹配,版本太旧的话可能不支持CDP。
方案2:通过Firefox Profile配置(适合旧版本)
如果你的Firefox版本比较老,不支持CDP,可以试试用自定义Profile来修改部分请求头,但这个方法只能改Firefox允许通过偏好设置的头(比如User-Agent、Accept这类),自定义的X开头的头没法用这个方式设置。
代码示例:
from selenium import webdriver from selenium.webdriver.firefox.firefox_profile import FirefoxProfile # 创建自定义Profile profile = FirefoxProfile() # 修改User-Agent profile.set_preference("general.useragent.override", "MyOldBrowserUA/1.0") # 修改Accept请求头 profile.set_preference("network.http.accept.default", "text/html,application/xhtml+xml;q=0.9") # 启动浏览器,传入自定义Profile driver = webdriver.Firefox(firefox_profile=profile, executable_path="/path/to/your/geckodriver") driver.get("https://httpbin.org/headers")
方案3:用代理工具mitmproxy拦截修改(通用万能方案)
如果上面两种方法都满足不了你的需求,那试试mitmproxy这个代理工具吧——它能拦截所有HTTP/HTTPS请求,想改什么头就改什么头,完全不受浏览器限制,而且Python 3.6.5也兼容。
步骤如下:
- 先安装mitmproxy:
pip install mitmproxy
- 写一个简单的修改头的脚本,比如命名为
modify_headers.py:
from mitmproxy import http def request(flow: http.HTTPFlow) -> None: # 添加自定义头 flow.request.headers["X-Custom-Header"] = "CustomValue123" # 替换User-Agent flow.request.headers["User-Agent"] = "ProxyModifiedUA/1.0" # 甚至可以删除某个头 if "Accept-Encoding" in flow.request.headers: del flow.request.headers["Accept-Encoding"]
- 启动mitmproxy的命令行版本mitmdump,加载脚本:
mitmdump -s modify_headers.py
- 在Selenium里配置代理,让请求走mitmproxy:
from selenium import webdriver from selenium.webdriver.firefox.options import Options options = Options() # 设置HTTP和HTTPS代理为本地的mitmproxy端口(默认8080) options.set_preference("network.proxy.type", 1) options.set_preference("network.proxy.http", "localhost") options.set_preference("network.proxy.http_port", 8080) options.set_preference("network.proxy.ssl", "localhost") options.set_preference("network.proxy.ssl_port", 8080) # 忽略证书错误(因为mitmproxy会用自签名证书) options.set_preference("network.stricttransportsecurity.preloadlist", False) options.set_preference("security.OCSP.enabled", 0) driver = webdriver.Firefox(options=options, executable_path="/path/to/your/geckodriver") # 第一次使用需要访问mitm.it安装证书,根据你的系统下载安装就行 driver.get("https://mitm.it") # 之后就可以访问目标页面了 driver.get("https://httpbin.org/headers")
这个方案虽然步骤多一点,但灵活性拉满,不管什么请求头都能改,还能做其他请求修改操作。
内容的提问来源于stack exchange,提问作者Tron




