You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Playwright无头模式(headless=True)失效问题求助

解决Playwright无头模式启动后立即关闭的问题

1. 修复浏览器启动参数的冲突与格式问题

你的启动参数存在几个会导致无头模式异常的问题:

  • --window-size='1920,1080'中的单引号是冗余的,会被当作参数的一部分,导致窗口尺寸设置失败
  • --start-maximized在无头模式下完全不生效,还可能和no_viewport=True产生冲突
  • 推荐使用Playwright官方的新无头模式(headless="new"),它的行为更接近真实浏览器,兼容性远优于旧版无头模式

修改start_driver方法中的浏览器启动代码:

browser = self.playwright.chromium.launch(
    headless="new",  # 替换原有的True或False
    args=[
        "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
        "--log-level=3",
        '--no-sandbox',
        "--enable-automation=False",
        "--disable-blink-features=AutomationControlled",
        "--window-size=1920,1080",  # 去掉多余的单引号
        # 移除--start-maximized,无头模式下无效
    ]
)
# 替换no_viewport=True,改用显式视口设置
context = browser.new_context(viewport={"width": 1920, "height": 1080})

2. 确保页面完全加载后再执行后续操作

无头模式下页面加载逻辑和有头模式存在差异,默认的page.goto(url)仅等待DOMContentLoaded,此时页面可能还未渲染完成、关键元素未加载,直接导致后续操作失败,程序提前退出。给page.goto添加等待条件:

page.goto(url, wait_until="networkidle")  # 等待500ms内无网络请求,确保页面完全加载

3. 排查多线程与Playwright的兼容性问题

虽然你在每个线程内都创建了独立的sync_playwright实例,但ThreadPoolExecutor的线程模型和Playwright同步API可能存在隐性冲突。可以尝试:

  • 降低线程数测试,比如把max_workers设为2,排查是否是并发过高导致的资源耗尽
  • 改用ProcessPoolExecutor替代ThreadPoolExecutor,Playwright同步API在多进程环境下更稳定:
from concurrent.futures import ProcessPoolExecutor

# 在main函数中替换线程池为进程池
with ProcessPoolExecutor(max_workers=len(days)) as executor:
    executor.map(pinnacle_day, days)

注意:使用多进程时,要把嵌套的pinnacle_day函数移到main外面,确保代码可序列化。

4. 添加错误捕获与日志排查

在playwright_stuffs函数中加入异常捕获,打印错误信息,就能明确无头模式下具体哪里出了问题:

def playwright_stuffs(url, day):
    try:
        with sync_playwright() as p:
            automation = PlaywrightAutomation(p)
            b, c, pg = automation.start_driver(url)

            # ... 你的中间操作代码 ...

            html_content = pg.content()

            c.close()
            b.close()

            with open(f'pinnacle_{day}.txt', 'w') as file:
                file.write(html_content)

            return html_content
    except Exception as e:
        print(f"处理{day}时出错: {str(e)}")
        with open(f'error_{day}.txt', 'w') as f:
            f.write(str(e))
        raise

5. 补充反自动化检测参数

部分网站会针对无头模式做额外检测,可以添加以下参数强化反检测:

args=[
    # ... 现有参数 ...
    "--disable-dev-shm-usage",
    "--no-first-run",
    "--no-default-browser-check",
    "--disable-extensions",
    "--disable-popup-blocking",
]

优先尝试1、2、4三个步骤,基本能解决大部分无头模式启动异常;如果是并发导致的问题,再尝试步骤3。

内容的提问来源于stack exchange,提问作者Gabriele

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:44:53