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

使用Puppeteer获取职位描述时重复漏项问题排查

解决Indeed职位描述重复获取、内容遗漏的问题

问题根源

你的代码主要有两个核心问题:

  • 元素句柄失效:用page.$$提前获取的职位列表jobs是一组DOM元素句柄,当点击职位后页面动态更新(右侧加载新描述、DOM结构变动),这些句柄会失效,后续循环里的job.click()可能触发错误元素(比如重复点击前几个)。
  • 未等待内容更新:waitForSelector("#jobDescriptionText")只保证元素存在,但旧的职位描述可能还留在DOM里,导致你获取到的是上一个职位的内容。

修复方案

  1. 每次循环重新获取职位列表,避免句柄失效
  2. 等待职位描述的内容实际更新,而非仅等待元素存在
  3. 过滤掉非职位的列表项(比如广告、空项)
  4. 完善错误处理,不直接吞掉异常

修改后的代码

const puppeteer = require("puppeteer");
const fs = require("fs/promises");

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
    defaultViewport: { width: 1280, height: 800 },
  });

  const page = await browser.newPage();
  await page.goto(
    `https://www.indeed.com/jobs?q=data+analyst&l=New+York%2C+NY&vjk=fb43dfe81685438a`
  );

  // 先统计有效职位总数(过滤广告、空项)
  const jobCount = await page.$$eval(".jobsearch-ResultsList > li.result", el => el.length);

  let prevVjk = ""; // 跟踪当前职位的唯一标识

  for (let i = 0; i < jobCount; i++) {
    try {
      // 每次循环重新获取职位列表,避免句柄失效
      const jobs = await page.$$(".jobsearch-ResultsList > li.result");
      const job = jobs[i];
      if (!job) continue;

      // 滚动到职位可见位置后点击,避免元素不可见导致点击失败
      await job.scrollIntoView();
      await job.click();

      // 等待职位切换:通过Indeed的data-vjk属性判断内容是否更新
      prevVjk = await page.waitForFunction((oldVjk) => {
        const currentVjk = document.querySelector("#vjs-container")?.getAttribute("data-vjk");
        return currentVjk && currentVjk !== oldVjk;
      }, {}, prevVjk);

      // 获取更新后的职位描述
      const job_description = await page.$eval("#jobDescriptionText", el => el.textContent);

      // 写入文件时添加分隔符,方便区分不同职位
      await fs.appendFile("jobs.txt", `=== 职位 ${i + 1} ===\n${job_description}\n\n`);
      console.log(`已获取第${i + 1}个职位描述`);
    } catch (error) {
      console.error(`获取第${i + 1}个职位失败:`, error.message);
    }
  }

  await browser.close();
})();

关键改动说明

  • 用page.$$eval统计带.result类的真实职位数,过滤掉广告等无效项
  • 循环时每次重新获取职位列表,避免DOM更新导致的句柄失效
  • 监听职位容器的data-vjk属性变化,确保内容完全更新后再获取描述
  • 添加滚动操作,解决元素不可见导致的点击失败问题
  • 完善日志和错误打印,方便调试排查

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:38:10