使用Puppeteer爬取Facebook活动页面全部日期的技术问询
解决方法
核心问题
你用document.querySelector()只会返回第一个匹配的元素,所以只能拿到第一个日期。要获取所有日期,需要用document.querySelectorAll()获取所有匹配元素,再批量提取文本。
修改后的Puppeteer代码
const puppeteer = require('puppeteer'); const url = "https://www.facebook.com/events/search?q=Parties&sde=AbrQ9KopLfqYT7heXVVCxznkZYxRr9hU1JA4cdLbJhjgs56yyeHW3e833A9dGP1WlEHOyagjWyFL9Y79gw-Ko1iVuJCILVkpVsHkmSbBFb3SEA&filters=eyJmaWx0ZXJfZXZlbnRzX2NhdGVnb3J5OjAiOiJ7XCJuYW1lXCI6XCJmaWx0ZXJfZXZlbnRzX2NhdGVnb3J5XCIsXCJhcmdzXCI6XCIxODIxOTQ4MjYxNDA0NDgxXCJ9IiwiZmlsdGVyX2V2ZW50c19jYXRlZ29yeToxIjoie1wibmFtZVwiOlwiZmlsdGVyX2V2ZW50c19jYXRlZ29yeVwiLFwiYXJnc1wiOlwiXCJ9IiwicnBfZXZlbnRzX2xvY2F0aW9uOjAiOiJ7XCJuYW1lXCI6XCJmaWx0ZXJfZXZlbnRzX2xvY2F0aW9uXCIsXCJhcmdzXCI6XCIxMDg1NjA0MDI1MDgxNDFcIn0ifQ%3D%3D"; (async () => { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); await page.setViewport({ width: 1200, height: 1000 }); await page.goto(url, { waitUntil: "networkidle2" }); // 等待目标元素加载完成,避免因DOM未渲染导致拿不到数据 await page.waitForSelector('.x193iq5w.xeuugli.x13faqbe.x1vvkbs.x10flsy6.x1nxh6w3.x1sibtaa.x1s688f.xzsf02u'); let allDates = await page.evaluate(() => { // 获取所有匹配的日期元素 const dateElements = document.querySelectorAll('.x193iq5w.xeuugli.x13faqbe.x1vvkbs.x10flsy6.x1nxh6w3.x1sibtaa.x1s688f.xzsf02u'); // 转换为数组并提取每个元素的文本内容 return Array.from(dateElements).map(el => el.innerText.trim()); }); console.log('所有活动日期:'); console.log(allDates); await browser.close(); })();
关键修改点
- 替换
document.querySelector()为document.querySelectorAll(),获取所有匹配的日期元素集合 - 用
Array.from()把元素集合转为数组,再通过map()批量提取每个元素的innerText - 添加
page.waitForSelector()等待元素加载,确保DOM渲染完成后再提取数据
额外提示
如果页面是滚动加载更多活动(下滑才会加载新的活动卡片),你需要添加滚动逻辑,比如循环滚动页面直到没有新内容加载,再提取所有日期。示例滚动逻辑:
// 滚动到页面底部加载更多内容 async function autoScroll(page) { await page.evaluate(async () => { await new Promise((resolve) => { let totalHeight = 0; let distance = 1000; let timer = setInterval(() => { let scrollHeight = document.body.scrollHeight; window.scrollBy(0, distance); totalHeight += distance; if (totalHeight >= scrollHeight) { clearInterval(timer); resolve(); } }, 1000); }); }); } // 在page.goto之后调用: await autoScroll(page);
内容的提问来源于stack exchange,提问作者Swanito
相关产品推荐
相关产品推荐

