如何用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
相关产品推荐
相关产品推荐

