Puppeteer页面无法加载求助:页面未加载且浏览器无法关闭
解决Puppeteer无法加载目标页面且浏览器无法关闭的问题
看起来你遇到的情况很典型——页面加载卡住、请求事件完全没触发,连浏览器都关不掉,大概率是反爬机制拦截或者代码缺少错误处理导致的。我帮你拆解下原因和解决办法:
可能的原因
- 无头浏览器被检测:Puppeteer默认以无头模式启动,很多网站会通过
navigator.webdriver等属性识别无头浏览器,直接阻止页面加载,甚至让请求根本发不出去,这就解释了为什么三个请求事件都没触发。 - 缺少超时控制:
page.goto()默认会无限等待页面加载完成(直到所有资源都加载完毕),如果页面因为反爬或者资源问题卡住,代码会一直停在这一步,后面的browser.close()根本执行不了。 - 错误处理缺失:你的代码没有
try/catch块,一旦page.goto()抛出错误,整个异步函数会直接崩溃,浏览器进程就会残留无法关闭。
修复步骤和优化后的代码
先试试下面的修改,应该能解决你的问题:
const puppeteer = require('puppeteer'); (async () => { let browser; try { // 1. 关闭无头模式,直观查看页面加载情况 browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); // 2. 模拟真实浏览器的UA,绕过基础反爬 await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'); // 3. 隐藏webdriver属性,避免被反爬检测 await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined, }); }); // 优化事件监听,输出关键信息(而非整个对象) page.on('request', (req) => console.log(`发起请求: ${req.url()}`)); page.on('requestfailed', (req) => console.log(`请求失败: ${req.url()} - ${req.failure().errorText}`)); page.on('requestfinished', (req) => console.log(`请求完成: ${req.url()}`)); // 4. 添加超时和等待策略,避免无限等待 await page.goto('https://www.gsksaglik.com/internal-redirects.html', { timeout: 10000, // 10秒超时,避免卡住 waitUntil: 'domcontentloaded' // 只等待DOM加载完成,不用等所有资源 }); } catch (error) { // 捕获错误,方便排查 console.error('加载出错:', error.message); } finally { // 确保无论成功失败,都关闭浏览器 if (browser) { await browser.close(); } } })();
额外排查建议
- 运行修改后的代码时,观察弹出的浏览器窗口:看看页面是不是跳转到了人机验证页面,或者有什么加载报错(比如403、500),这能直接帮你定位问题。
- 如果还是无法加载,可以尝试禁用JavaScript(
await page.setJavaScriptEnabled(false)),看看是不是JS反爬在搞鬼;或者添加cookie、设置viewport模拟移动端/桌面端。
内容的提问来源于stack exchange,提问作者Valip




