Selenium导入Python模块时重复创建浏览器窗口的解决方法
解决爬虫模块重复实例化浏览器的问题
避免重复打开浏览器的两种方案
方案1:将浏览器实例作为参数传入模块函数
这是最直接的方式,在主程序中初始化一次浏览器,然后把实例传递给各个模块的函数使用:
修改
main.py,先初始化浏览器实例,再调用模块函数时传入:from selenium import webdriver import navigate_home_page # 仅初始化一次Chrome浏览器 driver = webdriver.Chrome() # 把已有的driver实例传给导航函数 navigate_home_page.go_to_target_site(driver)修改
navigate_home_page.py,让函数接收driver参数:def go_to_target_site(driver): # 直接使用传入的浏览器实例导航,不会新开窗口 driver.get("https://你要爬的电商网站域名")
方案2:用单例模式统一管理浏览器实例
如果不想每次传参,可以封装一个单例类,确保全局只有一个浏览器实例:
新建
browser_manager.py模块,实现单例逻辑:from selenium import webdriver class BrowserManager: _driver_instance = None @classmethod def get_driver(cls): if cls._driver_instance is None: cls._driver_instance = webdriver.Chrome() return cls._driver_instance在
navigate_home_page.py中调用单例类获取浏览器:from browser_manager import BrowserManager def go_to_target_site(): driver = BrowserManager.get_driver() driver.get("https://你要爬的电商网站域名")main.py中直接调用函数即可,无需自己初始化:import navigate_home_page # 第一次调用会初始化浏览器,后续调用复用已有实例 navigate_home_page.go_to_target_site()
关于模块化开发的结论
完全不需要编写单文件重复代码,模块化开发是更合理的选择。你可以继续把爬虫拆分为导航、价格采集、数据存储、定时任务等独立模块,通过上述两种方式共享浏览器实例,既保证代码复用,又避免重复初始化浏览器导致的资源浪费和效率问题。
内容的提问来源于stack exchange,提问作者Just doing my best
相关产品推荐
相关产品推荐

