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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:15:31