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
我注意到的一些事情可能对解决您的问题有帮助,也可能没有帮助:
除非你真的需要,否则最好在循环外调用driver = get_chromedriver()
,循环完成后调用运行 driver.quit()
,即将大大加快您的执行速度,因为您的浏览器不需要重新打开。但是,如果您正在访问同一网站的多个实例,那么您可能需要依赖于您的方法。
driver.quit()
应该足以满足您的使用需求,这里不需要 driver.close()
。
如果你确定要使用多个实例,使用线程可能会更好。我听说过一些情况,如果 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。
我尝试使用 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
我注意到的一些事情可能对解决您的问题有帮助,也可能没有帮助:
除非你真的需要,否则最好在循环外调用
driver = get_chromedriver()
,循环完成后调用运行driver.quit()
,即将大大加快您的执行速度,因为您的浏览器不需要重新打开。但是,如果您正在访问同一网站的多个实例,那么您可能需要依赖于您的方法。driver.quit()
应该足以满足您的使用需求,这里不需要driver.close()
。如果你确定要使用多个实例,使用线程可能会更好。我听说过一些情况,如果 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。