如何为SeleniumBase(Undetected Chrome Driver)设置请求头?
解决SeleniumBase uc=True模式下设置请求头的问题
方案1:修正CDP命令的执行时机
uc=True模式下,CDP命令Network.setExtraHTTPHeaders需要在页面加载之前正确启用Network域并设置头,否则可能被浏览器忽略。试试以下代码:
from seleniumbase import SB with SB(uc=True) as sb: # 先启用Network监控 sb.driver.execute_cdp_cmd("Network.enable", {}) # 设置全局额外请求头 custom_headers = {"Accept": "application/json"} sb.driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": custom_headers}) # 再访问目标页面 sb.get("https://你的目标地址.com")
如果单个请求需要单独设置,可以在发起请求前重复执行setExtraHTTPHeaders——部分网站可能会在页面导航时重置头信息,这种情况下需要每次请求前重新配置。
方案2:集成Requestly扩展到Undetected Chrome
既然手动用Requestly有效,你可以把配置好规则的Requestly扩展打包成CRX,再加载到SeleniumBase的uc模式中:
- 在普通Chrome浏览器中安装Requestly,配置好
Accept: application/json的规则,然后通过扩展管理页面的「打包扩展程序」功能导出CRX文件。 - 启动SeleniumBase时加载该CRX:
from seleniumbase import SB # 替换为你的Requestly CRX文件路径 requestly_crx = "/本地路径/requestly-with-rules.crx" with SB(uc=True, extensions=[requestly_crx]) as sb: # 此时访问页面会自动应用Requestly的规则 sb.get("https://你的目标地址.com")
这种方式和手动操作完全一致,稳定性高,适合复杂的请求头规则场景。
方案3:通过Chrome启动参数设置全局头
尝试用Chrome的--header启动参数直接指定请求头,部分环境下uc模式兼容此参数:
from seleniumbase import SB chrome_options = { "args": ["--header=Accept: application/json"] } with SB(uc=True, chrome_options=chrome_options) as sb: sb.get("https://你的目标地址.com")
注意:部分Chrome版本或uc模式的配置可能会屏蔽该参数,需要实际测试验证。
方案4:用JS Fetch发起带自定义头的请求
如果只是需要获取JSON数据,完全可以在登录后的浏览器上下文中,直接执行JS发起请求——自动携带会话Cookie,无需纠结驱动的头设置:
from seleniumbase import SB with SB(uc=True) as sb: # 先完成登录流程,保持会话 sb.get("https://登录页面.com") # 模拟登录操作... # 用Fetch API发起请求,自定义Accept头 fetch_js = """ return fetch('https://目标API地址.com', { method: 'GET', headers: { 'Accept': 'application/json' } }).then(res => res.json()); """ api_result = sb.driver.execute_script(fetch_js) print(api_result)
这种方式不受浏览器驱动的头限制,可靠性极高,适合API数据爬取场景。
内容的提问来源于stack exchange,提问作者MandyShaw
相关产品推荐
相关产品推荐

