使用Selenium+Chromedriver爬取时如何自动关闭循环中弹出的窗口?
Selenium循环爬取弹出大量窗口解决方法
问题根源
你当前的代码每次循环都会重新初始化Chrome驱动实例,相当于每次循环都新开一个独立的浏览器窗口,循环执行多少次就会弹出多少个窗口,同时还会残留大量后台驱动进程占用资源。
解决方案
方案1:复用同一个浏览器窗口(最优推荐)
将浏览器初始化逻辑放到循环外部,全程只使用同一个窗口加载页面,无需反复新开窗口,运行效率更高也不会出现多窗口问题。
代码示例:
from selenium import webdriver import time # 浏览器初始化放在循环外面,全程只开1个窗口 browser = webdriver.Chrome(r'C:\Users\kinet\OneDrive\Documents\webscraper\chromedriver.exe') i = 0 while i != 10: url = 'https://hytrack.me/' browser.get(url) time.sleep(10) text = browser.find_element_by_xpath('//*[@id="stat_totalPlayers"]').text print(text) i += 1 # 全部循环结束后再关闭浏览器 browser.quit()
方案2:每次循环结束关闭当前浏览器
如果业务需求确实需要每次循环都开全新的浏览器窗口,只需要在每次循环末尾添加browser.quit()方法,即可完全关闭当前浏览器窗口和对应的驱动进程,不会残留窗口。
代码示例:
from selenium import webdriver import time i = 0 while i != 10: url = 'https://hytrack.me/' browser = webdriver.Chrome(r'C:\Users\kinet\OneDrive\Documents\webscraper\chromedriver.exe') browser.get(url) time.sleep(10) text = browser.find_element_by_xpath('//*[@id="stat_totalPlayers"]').text print(text) # 每次循环结束直接关闭整个浏览器 browser.quit() i += 1
补充说明
- 注意区分
browser.close()和browser.quit():前者仅关闭当前激活的标签页,不会结束浏览器驱动进程,依旧会残留后台进程占用资源;后者会完全关闭整个浏览器实例并终止对应驱动进程,是清理窗口的正确方法。 - 如果你使用的是Selenium 4.0及以上版本,
find_element_by_xpath方法已被弃用,可以替换为以下写法:
# 首先导入By类 from selenium.webdriver.common.by import By # 替换原来的find_element_by_xpath写法 text = browser.find_element(By.XPATH, '//*[@id="stat_totalPlayers"]').text
内容的提问来源于stack exchange,提问作者kineticcat_
相关产品推荐
相关产品推荐

