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

使用Puppeteer从多script标签网页提取指定JS变量的方法咨询

可行实现方案

针对动态生成script type属性导致无法通过CSS选择器定位的问题,有三个落地成本极低的稳定方案:

  • 方案1:遍历script标签,通过固定业务特征匹配目标块
    动态type属性是前端反爬的常见混淆手段,只会修改标签属性,不会改动script标签内的业务代码文本。你贴的代码片段里//速報、breaking-news、verticalMarquee、//焦點大圖、var data =这些业务逻辑相关的内容都是固定不变的,用这些特征做匹配就能精准定位目标script,完全不受type属性变化影响。
    参考实现代码:

    // 提取目标script的文本内容
    const scriptContent = await page.evaluate(() => {
      const scriptList = Array.from(document.querySelectorAll('script'));
      const target = scriptList.find(script => {
        const text = script.textContent?.trim() || '';
        // 多特征组合匹配,降低误判概率
        return text.includes('//速報')
          && text.includes('verticalMarquee')
          && text.includes('//焦點大圖')
          && text.includes('var data =');
      });
      return target?.textContent || '';
    });
    
    // 从脚本文本中提取data变量内容,简单场景用正则即可
    const dataMatch = scriptContent.match(/var data = (\[[\s\S]*?\]);/);
    if (dataMatch) {
      // 转成可操作的JS对象,注意自行做好安全校验
      const newsData = eval(`(${dataMatch[1]})`);
      console.log('提取到的头条数据', newsData);
    }
    

    如果对解析稳定性要求高,可以替换正则为JS AST解析工具提取变量赋值,容错率更高。

  • 方案2:提前注入钩子拦截变量赋值
    如果目标data变量最终会挂载到window全局上下文,你可以在页面发起导航前提前注入JS监听代码,直接捕获变量赋值的时机拿到数据,不需要定位script标签。如果变量是在函数作用域内声明,这个方案不适用,优先选方案1。
    参考实现逻辑:

    // 导航到页面前注入拦截逻辑
    await page.evaluateOnNewDocument(() => {
      // 按需写拦截逻辑,比如监听window上的属性变化,或hook对应初始化方法
    });
    await page.goto('目标页面地址', { waitUntil: 'networkidle2' });
    
  • 方案3:直接抓取数据接口
    页面上的头条数据本质是调用后端接口拉取的,打开浏览器开发者工具的网络面板,筛选XHR/ Fetch请求,找到返回头条列表的结构化接口,后续直接请求该接口拿数据即可,不需要解析页面JS,长期维护成本最低。

资料检索关键词
  • Puppeteer 定位无固定属性script标签
  • 动态混淆script标签内容提取
  • JS文本正则提取变量值
  • Puppeteer 页面上下文变量拦截
  • 网页爬虫 前端混淆反爬绕过

内容的提问来源于stack exchange,提问作者mmkrty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:51:19