Selenium 4.11.2用ScraperApi代理报desired_capabilities错误求助
问题解决方案
1. 解决desired_capabilities参数错误
这个错误源于你使用的seleniumwire版本与Selenium 4.11.2不兼容——旧版seleniumwire仍在向WebDriver传递已被弃用的desired_capabilities参数。
修复步骤:
- 升级seleniumwire到兼容Selenium 4的版本:
pip install seleniumwire>=5.0.0 - 修正代理配置中的环境变量解析错误(原f-string无法直接解析
os.environ["SCRAPERAPI_KEY"]):
修改proxy_options部分代码:import os scraper_api_key = os.getenv("SCRAPERAPI_KEY") proxy_options = { 'proxy': { 'http': f'http://scraperapi:{scraper_api_key}@proxy-server.scraperapi.com:8001', 'https': f'http://scraperapi:{scraper_api_key}@proxy-server.scraperapi.com:8001', 'no_proxy': 'localhost,127.0.0.1' } } - 升级后的seleniumwire会自动适配Selenium 4的参数格式,无需修改
webdriver.Remote的调用逻辑。
2. 代理环境下保留元素等待逻辑
完全可以保留原有的WebDriverWait等待逻辑。代理仅改变请求的网络出口,页面元素的加载状态检测逻辑不受任何影响。甚至因为代理可能导致页面加载速度变慢,保留等待逻辑能更可靠地确保元素加载完成后再执行后续操作,避免出现元素未找到的异常。
你现有代码中的WebDriverWait(selenium_driver, 60).until(EC.presence_of_element_located(...))可以直接复用,无需修改。
3. 解决请求过多及本地请求浪费问题
针对ScrapeOps短时间请求过多:
- 添加随机请求延迟:在每次页面请求后添加2-5秒的随机延迟,避免触发频率限制:
import time import random # 在selenium_driver.get(deals_page)后添加 time.sleep(random.uniform(2, 5)) - 控制并发数:避免同时启动多个WebDriver实例,采用单实例串行请求的方式。
- 严格遵守代理服务商的频率限制:查看ScrapeOps官方文档,设置符合要求的请求间隔与并发数。
针对本地WebDriver无意义消耗请求:
- 复用WebDriver实例:不要每次调用
get_all_deals_ids都重新启动driver,可以将driver作为参数传入,完成所有爬取任务后再统一退出:
修改代码示例:def get_all_deals_ids(selenium_driver): deals_page = "https://www.amazon.it/......." try: selenium_driver.get(deals_page) # 原有爬取逻辑保持不变 except Exception as e: print(e) return [] # 使用时: driver = start_selenium() try: result = get_all_deals_ids(driver) # 执行其他爬取任务 finally: driver.quit() - 优化ChromeOptions减少无关请求:
在chromium_options中添加以下参数,禁用非必要资源加载:chromium_options.add_argument("--blink-settings=imagesEnabled=false") chromium_options.add_argument("--disable-css") # 若页面依赖JavaScript则不要添加下面这行 chromium_options.add_argument("--disable-javascript") - 启用ScraperApi会话保持:在代理URL末尾添加
&session_id=自定义标识,复用同一个代理IP,减少IP切换带来的额外请求开销。
内容的提问来源于stack exchange,提问作者Migatte
相关产品推荐
相关产品推荐

