使用Puppeteer流式读取网站文件遇阻,求解决方案
解决方案:Puppeteer流式读取文件绕开安全拦截
1. 跳过page.goto,直接用带cookie的HTTP请求拿流
page.goto触发的下载容易被网站的无头浏览器检测拦截,不如直接提取当前会话的Cookie和UA,用Node.js原生工具发起流式请求:
// 从已登录页面提取Cookie和UA const cookies = await page.cookies(); const cookieStr = cookies.map(c => `${c.name}=${c.value}`).join('; '); const userAgent = await page.evaluate(() => navigator.userAgent); // 发起流式GET请求 const res = await fetch(fileDownloadUrl, { headers: { 'Cookie': cookieStr, 'User-Agent': userAgent, 'Referer': page.url() // 按需添加,防止防盗链拦截 } }); // 获取可读流,直接处理(支持解压流式处理) const fileStream = res.body; // 示例:对接gzip解压流 const zlib = require('zlib'); const unzipStream = zlib.createGunzip(); fileStream.pipe(unzipStream).on('data', chunk => { // 实时处理解压后的chunk console.log(chunk.toString()); });
2. 优化Puppeteer启动参数,降低被检测概率
如果必须通过页面触发下载,先调整启动参数模拟真实浏览器,减少拦截:
const browser = await puppeteer.launch({ headless: 'new', args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled', '--disable-dev-shm-usage' ], defaultViewport: null, userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' }); // 禁用自动化特征检测 await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); Object.defineProperty(window, 'chrome', { value: {} }); });
3. 监听Puppeteer的download事件获取流
直接利用Puppeteer的download事件,拿到下载的流对象,无需等待文件完全下载:
// 监听下载事件 page.on('download', async (download) => { // 获取下载流 const readStream = await download.createReadStream(); // 流式处理,比如解压+实时解析 const unzip = require('zlib').createInflate(); readStream.pipe(unzip).on('data', (chunk) => { // 这里写你的实时处理逻辑 }); }); // 触发下载(比如点击页面下载按钮,或用evaluate触发) await page.click('#download-btn');
4. 排查ERR_ABORTED的具体原因
启用Puppeteer的日志输出,查看拦截的详细信息:
const browser = await puppeteer.launch({ headless: 'new', args: ['--enable-logging', '--v=1'] // 输出详细日志 });
检查日志中是否有防盗链、UA检测、Cookie缺失等提示,针对性补充请求头。
内容的提问来源于stack exchange,提问作者Bennyh961
相关产品推荐
相关产品推荐

