将 ScraperAPI 与 Python Selenium 一起使用时出错

Error using ScraperAPI With Python Selenium

我不知道这段代码的错误在哪里。基本上它在搜索栏中插入一个代码,单击一个按钮并提取结果:

from seleniumwire import webdriver
import time

API_KEY = 'my_api_key'

proxy_options = {
    'proxy': {
        'https': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001',
        'no_proxy': 'localhost,127.0.0.1'
    }
}

url =  'https://www.ufficiocamerale.it/'

vats = ['06655971007', '05779661007', '08526440154']

for vat in vats:

    driver = webdriver.Chrome(seleniumwire_options=proxy_options)
    driver.get(url)

    time.sleep(5)

    item = driver.find_element_by_xpath('//form[@id="formRicercaAzienda"]//input[@id="search_input"]')
    item.send_keys(vat)

    time.sleep(1)

    button = driver.find_element_by_xpath('//form[@id="formRicercaAzienda"]//p//button[@type="submit"]')
    button.click()

    time.sleep(5)

    all_items = driver.find_elements_by_xpath('//ul[@id="first-group"]/li')
    for item in all_items:
        if '@' in item.text:
            print(item.text.split(' ')[1])

driver.close()

运行 脚本(chromedriver.exe 保存在同一个文件夹中,我在 Jupyter Notebook 中工作,如果重要的话)我得到

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//form[@id="formRicercaAzienda"]//input[@id="search_input"]"}

但是这个元素存在,因为在没有 ScraperAPI 的情况下尝试脚本我没有得到任何错误。任何人都可以找出问题所在吗?

  1. 这是一个 运行 3 vat 值的循环。
    第一次单击搜索按钮后,将显示结果页面。
    那里没有搜索输入字段和搜索按钮!
    因此,为了执行新的搜索,您需要在获取结果页面上的数据后返回到上一页。
  2. 无需每次迭代都创建新的 Web 驱动程序实例。
  3. 此外,您应该使用预期条件显式等待而不是硬编码暂停。
    这应该会更好:
from seleniumwire import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

API_KEY = 'my_api_key'

proxy_options = {
    'proxy': {
        'https': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001',
        'no_proxy': 'localhost,127.0.0.1'
    }
}

url =  'https://www.ufficiocamerale.it/'

vats = ['06655971007', '05779661007', '08526440154']



driver = webdriver.Chrome(seleniumwire_options=proxy_options)
wait = WebDriverWait(driver, 20)
driver.get(url)


for vat in vats:
    input_search = wait.until(EC.visibility_of_element_located((By.XPATH, '//form[@id="formRicercaAzienda"]//input[@id="search_input"]')))
    input_search.clear()
    input_search.send_keys(vat)

    time.sleep(0.5)

    wait.until(EC.visibility_of_element_located((By.XPATH, '//form[@id="formRicercaAzienda"]//p//button[@type="submit"]'))).click()

    wait.until(EC.visibility_of_element_located((By.XPATH, '//ul[@id="first-group"]/li')))

    time.sleep(0.5)

    all_items = driver.find_elements_by_xpath('//ul[@id="first-group"]/li')
    for item in all_items:
        if '@' in item.text:
            print(item.text.split(' ')[1])
    driver.execute_script("window.history.go(-1)")

driver.close()

UPD
此代码有效,输出为

enelenergia@pec.enel.it
info@pec.terna.it
edisonenergia@pec.edison.it