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

如何用Puppeteer获取视频上传时间并实现循环刷新筛选?

Puppeteer获取YouTube搜索结果并筛选近期视频解决方案

以下是修正后的完整代码,解决了文本获取和循环逻辑的问题,同时适配你的业务需求:

const puppeteer = require('puppeteer');
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));

(async () => {
  const browser = await puppeteer.launch({ headless: false }); // 测试阶段可开启可视化模式
  const page = await browser.newPage();
  await page.goto('YOUR_YOUTUBE_SEARCH_URL'); // 替换为你的目标搜索链接

  while (true) {
    try {
      // 等待搜索结果渲染完成,确保目标时间元素存在
      await page.waitForSelector('#metadata-line > span:nth-child(4)', { timeout: 5000 });

      // 获取所有视频的上传时间元素
      const timeElements = await page.$$('#metadata-line > span:nth-child(4)');
      let hasQualifiedVideo = false;

      for (const el of timeElements) {
        // 提取上传时间文本
        const timeText = await el.evaluate(node => node.textContent.trim());
        // 匹配文本中的数字部分
        const numMatch = timeText.match(/uploaded (\d+) .+ ago/);
        if (!numMatch) continue;

        const timeNum = parseInt(numMatch[1]);
        if (timeNum < 5) {
          // 获取对应视频的链接
          const videoLink = await el.evaluate(node => 
            node.closest('ytd-video-renderer').querySelector('#video-title-link').href
          );
          console.log('找到符合条件的视频:', videoLink);

          // 1. 存入数据库(替换为你的数据库操作逻辑)
          // await saveVideoLinkToDB(videoLink);

          // 2. 执行评论操作(替换为你的评论逻辑)
          // await postComment(page, videoLink);

          hasQualifiedVideo = true;
          // 若只需处理第一个符合条件的视频,可添加break退出循环
          // break;
        }
      }

      if (hasQualifiedVideo) {
        console.log('已完成符合条件视频的处理,结束监控');
        break; // 如需持续监控可移除该行
      } else {
        console.log('未找到目标视频,10秒后刷新页面');
        await delay(10000);
        await page.reload();
      }
    } catch (err) {
      console.error('处理出错:', err);
      console.log('10秒后重试');
      await delay(10000);
      await page.reload();
    }
  }

  // 无需持续运行时可关闭浏览器
  // await browser.close();
})();

// 示例数据库存储函数(需根据实际业务实现)
// async function saveVideoLinkToDB(link) {
//   // 你的数据库插入逻辑,如MySQL/MongoDB操作
// }

// 示例评论操作函数(需根据实际业务实现)
// async function postComment(page, videoLink) {
//   await page.goto(videoLink);
//   await page.waitForSelector('#placeholder-area');
//   await page.click('#placeholder-area');
//   await page.type('#contenteditable-root', '测试评论内容');
//   await page.click('#submit-button');
//   await delay(2000); // 等待评论提交完成
// }

关键修复说明

  • 元素加载保障:用waitForSelector等待目标时间元素渲染完成,避免页面未加载完全导致的空文本问题,设置5秒超时触发重试逻辑。
  • 时间数值提取:通过正则表达式/uploaded (\d+) .+ ago/精准匹配数字,兼容单复数时间格式(minutes/minute、seconds/second)。
  • 异步循环控制:使用while(true)结合await delay替代setInterval,确保页面刷新、元素获取等异步操作按顺序执行,避免逻辑冲突。
  • 视频链接定位:通过closest('ytd-video-renderer')找到视频父容器,再获取标题链接,保证URL的准确性。
  • 异常处理:添加try-catch块捕获页面加载、元素获取等异常,防止程序崩溃,出错后自动重试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:38:26