Mac环境Python Selenium循环截图报[Errno 61] Connection refused错误
问题根因
- 核心错误根源:报错指向的连接目标是
127.0.0.1:54000,这是ChromeDriver启动时在本地临时监听的服务端口,和你要访问的外部天气网站完全无关。Selenium的所有操作本质都是给本地的ChromeDriver服务发HTTP请求,一旦这个本地进程被关闭,后续所有调用都会触发“连接被拒绝”的报错。 - 你的代码在循环外仅初始化了一次driver实例,第一次执行完截图逻辑后就调用了
driver.quit(),直接关闭了Chrome进程、终止了ChromeDriver的本地端口监听。但下一轮循环执行时,没有重新创建新的driver实例,直接复用已经失效的旧对象调用driver.get(),自然无法建立连接。 - 代码存在两个会导致运行异常的隐性bug:
- 引入了
time.sleep(61)逻辑但没有导入time模块,第一次走到这段逻辑就会触发NameError - 直接用原始时间字符串拼接截图文件名,字符串中包含英文冒号,Mac系统不允许文件名包含冒号,生成的截图无法正常写入磁盘
- 引入了
- 你注释掉的其余4个站点的截图逻辑,本身是写在
driver.quit()之后的,就算没有连接报错,这些代码也会因为driver已经销毁完全无法执行。
可直接运行的修复代码
from datetime import datetime import time from selenium import webdriver from selenium.webdriver.chrome.options import Options def init_chrome_driver(): """初始化带统一配置的Chrome驱动""" options = webdriver.ChromeOptions() options.add_argument('--headless=new') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') # 解决Mac下headless模式内存占用异常的问题 options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36') return webdriver.Chrome('/Library/Frameworks/Python.framework/Versions/3.8/bin/chromedriver', options=options) def capture_fullpage_screenshot(driver, target_url, save_file_name): """通用全页面截图逻辑""" driver.get(target_url) # 等待页面核心资源加载完成,避免截到空白页 time.sleep(2) scroll_width = driver.execute_script('return document.body.parentNode.scrollWidth') scroll_height = driver.execute_script('return document.body.parentNode.scrollHeight') driver.set_window_size(scroll_width, scroll_height) # 替换已废弃的旧版API find_element_by_tag_name driver.find_element('tag name', 'body').screenshot(save_file_name) if __name__ == "__main__": # 所有待截图的站点配置 SCREENSHOT_TASKS = [ ("accu1", "https://www.accuweather.com/en/ie/moroe/1079356/current-weather/1079356"), ("accu2", "https://www.accuweather.com/en/ie/moroe/1079356/hourly-weather-forecast/1079356"), ("weatherchannel1", "https://weather.com/en-IE/weather/today/l/d71e95387799a552a061ec1550ac876dcc19b5d139adc6f51ba3b8bf7a6b96ed"), ("weatherchannel2", "https://weather.com/en-IE/weather/hourbyhour/l/d71e95387799a552a061ec1550ac876dcc19b5d139adc6f51ba3b8bf7a6b96ed#detailIndex4"), ("meteireann", "https://www.met.ie/weather-forecast/moroe-limerick#forecasts") ] # 循环外初始化一次driver,全程复用直到程序退出 driver = init_chrome_driver() try: while True: now = datetime.now() # 生成无非法字符的时间戳文件名,避免系统拒绝写入 file_timestamp = now.strftime("%Y%m%d%H%M%S") # 每偶数分钟执行一轮截图,替换原来复杂的字符串拼接判断逻辑 if now.minute % 2 == 0: for save_prefix, task_url in SCREENSHOT_TASKS: try: capture_fullpage_screenshot(driver, task_url, f"{save_prefix}_{file_timestamp}.png") except Exception as e: print(f"站点{save_prefix}截图失败: {str(e)}") # 每轮截图完成后等待61秒,不要提前销毁driver time.sleep(61) else: time.sleep(30) except KeyboardInterrupt: print("手动终止截图任务") finally: # 仅在程序退出时销毁浏览器会话 driver.quit()
额外注意事项
- 如果担心长时间运行的浏览器进程内存泄漏,可以每完成10轮截图就调用一次
driver.quit(),重新初始化新的driver实例,不要在每轮单页截图后就销毁会话。 - 旧版本的
find_element_by_tag_name、find_element_by_id等API已经在Selenium4版本中完全废弃,继续使用会抛出属性错误,统一替换为find_element(定位方式, 定位值)的新写法兼容性更好。 - 不要硬编码chromedriver的文件路径,可以通过版本匹配工具同步本地Chrome浏览器的驱动版本,减少后续版本升级带来的驱动不兼容问题。
内容的提问来源于stack exchange,提问作者Hugo Phelan
相关产品推荐
相关产品推荐

