You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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也兼容。

步骤如下:

  1. 先安装mitmproxy:
pip install mitmproxy
  1. 写一个简单的修改头的脚本,比如命名为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"]
  1. 启动mitmproxy的命令行版本mitmdump,加载脚本:
mitmdump -s modify_headers.py
  1. 在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

火山引擎 最新活动