我正在创建一个连接到 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 上遇到的任何链接,导致我不必要地消耗了宝贵的调用。
失败是因为
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
,只是不是您尝试使用的方法。