获取类型错误:WebDriver.__init__() 获得了意外的关键字参数“desired_capability”,尽管“desired_capability”已被弃用

问题描述 投票:0回答:1

我正在创建一个连接到 Telegram 机器人的抓取工具,该机器人收集亚马逊上的报价。但是,当我尝试使用代理服务器时遇到了问题。我在使用下面附加的代码时遇到的问题是它给了我以下错误:

File "/home/X/.local/lib/python3.10/site-packages/seleniumwire/webdriver.py", line 308, in __init__
    super().__init__(*args, **kwargs)
TypeError: WebDriver.__init__() got an unexpected keyword argument 'desired_capabilities'

尽管我读到

desired_capabilities
已在我使用的 Selenium 版本(4.11.2)中被弃用,但为什么它仍然给我这个错误?

我附上我正在使用的代码。我指定在本例中使用的代理来自 ScraperApi,该代理在此 link 的文档中指示了用于此类请求的代码。

from seleniumwire import webdriver

def start_selenium():
    chromium_options = webdriver.ChromeOptions()  
    chromium_options.add_argument("--headless")
    chromium_options.add_argument("--disable-extensions")
    chromium_options.add_argument("--disable-infobars")
    chromium_options.add_argument("--disable-notifications")
    chromium_options.add_argument("--disable-translate")
    chromium_options.add_argument("--incognito")   

    proxy_options = {
        'proxy': {
            'http': f'http://scraperapi:os.environ["SCRAPERAPI_KEY"]@proxy-server.scraperapi.com:8001',        
            'https': f'http://scraperapi:os.environ["SCRAPERAPI_KEY"]@proxy-server.scraperapi.com:8001',
            'no_proxy': 'localhost,127.0.0.1'
        }
    }

    chromium_driver = webdriver.Remote(command_executor='http://localhost:4444/wd/hub', 
                            options=chromium_options, 
                            seleniumwire_options=proxy_options)
    
    return chromium_driver

另外,仍然附加在这个问题上,是否可以使用我的原始代码来等待项目加载,即使使用代理也是如此?我也尝试过使用 ScrapeOps 代理,但是,尽管我设法在本地启动它,但它使用下面的代码在短时间内向我发送了太多请求:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def get_all_deals_ids():

    deals_page = "https://www.amazon.it/......."

    selenium_driver = start_selenium()

    try:
        selenium_driver.get(deals_page)

        WebDriverWait(selenium_driver, 60).until(EC.presence_of_element_located((By.CSS_SELECTOR, "a[class*='DealCard']"))) 

        elements_urls = [e.get_attribute("href") for e in selenium_driver.find_elements(By.CSS_SELECTOR, "a[class*='DealCard']")]

        deals_urls = []
        for url in elements_urls:
            if is_product(url):
                deals_urls.append(url)
            if ('/deal/' in url) or ('/browse/' in url):  
                deals_urls = deals_urls + get_submenus_urls(url)

        product_ids = {}
        for i, url in enumerate(deals_urls, start=1):
            if extract_product_id(url) is not None and extract_product_id(url) != '':
                product_id = extract_product_id(url)
                if product_id not in product_ids:
                    product_ids[product_id] = i

        selenium_driver.quit()
        return [*product_ids.items()]
        
    except Exception as e:
        print(e)
        selenium_driver.quit()
        return [] 

提前感谢任何能给我一些建议的人!

我尝试使用 ScraperApi 代理运行开头附加的代码,但我总是收到所需的功能错误。因此,我尝试使用另一个代理,这次使用本地网络驱动程序而不是远程代理,但结果是它调用了在 Deals_page 上遇到的任何链接,导致我不必要地消耗了宝贵的调用。

python selenium-webdriver web-scraping proxy seleniumwire
1个回答
0
投票

失败是因为

selenium-wire
库仍在
Remote()
定义中使用desired_capability: https://github.com/wkeeling/selenium-wire/blob/master/seleniumwire/webdriver.py#L298

不幸的是,由于库已存档,这个问题不太可能得到解决:https://github.com/wkeeling/selenium-wire

...这意味着您需要自己分叉存储库来进行修复,找到其他已经这样做过的人,或者将您的

selenium
版本降级到
desired_capabilities
仍然存在的版本。

或者也许你可以做你想做的事情而不使用

selenium-wire
,或者只是不使用
Remote()
。大部分
selenium-wire
仍然适用于最新版本的
selenium
,只是不是您尝试使用的方法。

© www.soinside.com 2019 - 2024. All rights reserved.