ESPNCricinfo API爬取受阻:Selenium Wire无法捕获目标请求咨询
问题解答:Selenium Wire无法捕获ESPNCricinfo的hs-consumer-api请求
1. 无法捕获请求的可能原因
- 请求由Service Worker发起:ESPNCricinfo这类现代网站常使用Service Worker处理API请求,Selenium Wire默认的代理拦截机制无法覆盖Service Worker的独立运行上下文,导致这类请求绕过代理不被捕获。
- 请求命中浏览器缓存:如果页面加载时目标API请求命中了浏览器缓存,不会发起新的网络请求,Selenium Wire自然无法捕获。
- Selenium Wire代理配置缺失:若未正确配置HTTPS拦截(比如未安装根证书),浏览器可能会拒绝通过代理发送HTTPS请求,导致目标API请求绕开代理。
2. 可行解决方案
方案一:禁用Service Worker
在ChromeOptions中添加禁用参数,强制请求回到普通上下文,让Selenium Wire能捕获:
from seleniumwire import webdriver chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--disable-service-workers") driver = webdriver.Chrome(options=chrome_options)
方案二:利用Chrome DevTools Protocol(CDP)捕获请求
直接通过CDP监听网络请求,不受Service Worker限制:
from selenium import webdriver driver = webdriver.Chrome() driver.execute_cdp_cmd('Network.enable', {}) def capture_request(request): if 'hs-consumer-api' in request['params']['request']['url']: headers = request['params']['request']['headers'] auth_token = headers.get('x-hsci-auth-token') print(f"获取到认证Token: {auth_token}") driver.add_cdp_listener('Network.requestWillBeSent', capture_request) # 访问目标计分卡页面 driver.get("你的目标赛事页面URL")
方案三:禁用浏览器缓存
确保每次加载页面都发起新请求,避免缓存导致请求不触发:
chrome_options.add_argument("--disable-cache") chrome_options.add_argument("--disk-cache-size=0")
方案四:从页面JS变量提取Token
部分网站会将认证Token嵌入页面的全局JS变量中,直接执行JS提取:
# 示例:假设Token存在window.__INITIAL_STATE__里 initial_state = driver.execute_script("return window.__INITIAL_STATE__") auth_token = initial_state.get('auth', {}).get('token')
方案五:替换为mitmproxy捕获请求
使用mitmproxy作为独立代理,它能捕获所有网络请求(包括Service Worker发起的):
- 启动mitmproxy:
mitmproxy - 配置Selenium使用mitmproxy代理:
chrome_options.add_argument("--proxy-server=http://127.0.0.1:8080") # 需提前安装mitmproxy的根证书到浏览器 driver = webdriver.Chrome(options=chrome_options)
之后在mitmproxy界面中筛选包含hs-consumer-api的请求,查看x-hsci-auth-token头。
内容的提问来源于stack exchange,提问作者Neel
相关产品推荐
相关产品推荐

