我试图实现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()
。 -
如果您确实想使用多个实例,那么使用线程可能会更好。我听说过一些情况,如果在反复破坏/重新创建驱动程序时使用循环,可能会出现问题。
尝试按如下方式更改代码。您声明一次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((方法关闭当前窗口
- quit((方法退出驱动程序并关闭所有关联的窗口
因此,如果您希望关闭一个窗口,请使用close()
,所有窗口-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
举个例子:如何使用Selenium/Python查找并比较具有样式属性的文本?
如果以上所有建议都不起作用,请尝试关闭finally
块中的Web驱动程序。