ChromeDriver 有时关闭有时不关闭

ChromeDriver sometimes does and sometimes doesn't close

我尝试使用 Selenium 从列表中抓取页面。在尝试抓取列表时,有时执行会停止。似乎有时执行不会超过 driver.close() 并且它完全随机发生。下面是我用来抓取多个页面的代码。

如果有人建议一种确保驱动程序在抓取数据后关闭的方法,我将不胜感激。

from selenium import webdriver
addresses = ['address1', 'address2',...]
results = []
for address in addresses:
    driver = get_chromedriver() # returns webdriver instance
    driver.get(f"https://www.example.com/{address}")
    values = scrape_some_data()

    driver.close()
    driver.quit()
    results.append(values)
 # do something with the list of values

我注意到的一些事情可能对解决您的问题有帮助,也可能没有帮助:

  1. 除非你真的需要,否则最好在循环外调用driver = get_chromedriver(),循环完成后调用运行 driver.quit(),即将大大加快您的执行速度,因为您的浏览器不需要重新打开。但是,如果您正在访问同一网站的多个实例,那么您可能需要依赖于您的方法。

  2. driver.quit() 应该足以满足您的使用需求,这里不需要 driver.close()

  3. 如果你确定要使用多个实例,使用线程可能会更好。我听说过一些情况,如果 destroying/recreating 驱动程序一遍又一遍地使用循环,就会出现问题。

尝试如下更改您的代码。 您声明一次 webdriver 实例并使用 driver.get 打开浏览器 url.

此外,我建议您在退出 webdriver 之前附加所有值。

from selenium import webdriver
driver = get_chromedriver() # returns webdriver instance
addresses = ['address1', 'address2',...]
results = []
for address in addresses:
    driver.get(f"https://www.example.com/{address}")
    values = scrape_some_data()
    results.append(values)
    driver.close()

# do something with the list of values

driver.close() 和 driver.quit() 之间的区别:

  • close() 方法关闭当前 window.
  • quit() 方法退出驱动程序并关闭每个关联的 window.

所以,如果你想关闭一个window,使用close(),所有windows - quit()

我还建议一件事:在关闭 webdriver 之前添加显式等待加载所有数据。 要使用显式等待导入:

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

并像这样使用:

wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "css_selector")))  # for a list of elements

以此为例:

如果以上所有建议都不起作用,请尝试在 finally 块中关闭 webdriver。