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
相关产品推荐
相关产品推荐

