Puppeteer无法获取带async属性的script标签问题咨询
解决Puppeteer无法获取带async属性的script标签问题
先修复代码中的明显错误
你的Scraper.js存在两处低级错误,会直接导致功能异常:
page.page.evaluate应为page.evaluate(重复调用了page对象)await page.browser.close()应为await browser.close()(需直接关闭浏览器实例,而非通过page对象调用)
核心解决方案:调整等待策略+正确捕获script属性
带async属性的脚本可能在networkidle0阶段还未被插入DOM,或页面网络空闲判断过早。可通过以下方式处理:
方案1:优化页面等待逻辑
将页面等待条件调整为更宽松的策略,同时增加额外等待时间,确保动态插入的script标签完成加载:
export default async function test (req, res){ const url = req.body.url; const browser = await puppeteer.launch(); const page = await browser.newPage(); // 优化等待策略,延长超时时间 await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 }); // 额外等待2秒,确保动态脚本插入完成 await page.waitForTimeout(2000); // 捕获所有script标签的src属性及async标记 const data = await page.evaluate( () => Array.from(document.querySelectorAll('script')) .map(elem => ({ src: elem.src || '', isAsync: elem.hasAttribute('async') })) ); console.log('总script数量:', data.length); console.log('带async的script数量:', data.filter(item => item.isAsync).length); await browser.close(); res.status(200).json(data); }
方案2:直接解析页面原始HTML
若部分async脚本是初始HTML中定义的,可直接获取完整页面HTML后用cheerio解析,规避DOM加载时机问题:
import cheerio from 'cheerio'; export default async function test (req, res){ const url = req.body.url; const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto(url, { waitUntil: 'domcontentloaded' }); const html = await page.content(); // 获取完整页面HTML const $ = cheerio.load(html); // 用cheerio提取所有script标签信息 const data = $('script').map((i, elem) => ({ src: $(elem).attr('src') || '', isAsync: $(elem).attr('async') !== undefined })).get(); console.log('总script数量:', data.length); console.log('带async的script数量:', data.filter(item => item.isAsync).length); await browser.close(); res.status(200).json(data); }
额外注意事项
- 若网站存在动态插入script的逻辑,可监听DOM的
DOMNodeInserted事件,确保捕获所有新增标签; - 启用已引入的puppeteer-extra和stealth插件,规避网站反爬检测:
import puppeteer from 'puppeteer-extra'; import StealthPlugin from 'puppeteer-extra-plugin-stealth'; puppeteer.use(StealthPlugin()); // 后续用puppeteer.launch()启动浏览器
内容的提问来源于stack exchange,提问作者Anshum Shailey
相关产品推荐
相关产品推荐

