You need to enable JavaScript to run this app. Mac环境Python Selenium循环截图报[Errno 61] Connection refused错误
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.13 19:24:01