【问题标题】:Scraping: Only first images are scraped, rest is filled with placeholder. Why?刮擦:只刮取第一张图像,其余的用占位符填充。为什么?
【发布时间】:2019-04-26 11:11:14
【问题描述】:

我正在使用 JavaScript 和无头浏览器 Puppeteer 抓取工作网站。

我成功地从一个工作网站获取了前 6 个公司徽标项目。但是,在前 6 个徽标之后,它会突然停止打印出真正的徽标(因此,为我提供了 src URL),而是输入了一个占位符图像。

这可能是什么原因?

仅供参考,我正在抓取这样的图像:

const image = card.querySelector('div.job-element__logo img').src

【问题讨论】:

  • 他们可能懒加载了javascript。他们有任何真实来源的属性吗?
  • 开发人员有时会加载占位符图像,因此在加载实际所需图像时页面上没有内容跳转或明显变化。尝试通过记录 @987654324 查看元素上的数据@ - 实际的 src 可能会列在该对象中。
  • 我正在尝试从以下网站获取公司徽标:stepstone.de/5/…
  • 似乎与延迟加载有关。我没有看到另一个源数据集。
  • 有占位符图片的有data-src属性

标签: javascript node.js web-scraping screen-scraping puppeteer


【解决方案1】:

图片正在延迟加载。

尚未加载的图像的正确src 存储在名为data-src 的data attribute 中。您可以将page.evaluate() 与Array.from() 结合使用来过滤和抓取所有正确的图像src 值:

const images = await page.evaluate(() => {
  return Array.from(document.querySelectorAll('.job-element__logo img'), e => e.dataset.src ? `https://www.stepstone.de${e.dataset.src}` : e.src);
});

如果您想为每个职位抓取职位、公司、描述和图片,您可以使用以下解决方案:

const jobs = await page.evaluate(() => {
  return Array.from(document.querySelectorAll('.job-element'), card => {
    const position = card.querySelector('.job-element__body__title').textContent.trim();
    const company = card.querySelector('.job-element__body__company').textContent.trim();
    const description = card.querySelector('.job-element__body__details').textContent.trim();
    const image_element = card.querySelector('.job-element__logo img');
    const image = image_element.dataset.src ? `https://www.stepstone.de${image_element.dataset.src}` : image_element.src;

    return {
      position,
      company,
      description,
      image,
    };
  });
});

【讨论】:

  • 谢谢!唯一剩下的就是它为我提供了所有徽标作为我的每个数组项(作业)中的数组。
  • const position = await page.evaluate(() => Array.from(document.querySelectorAll('.job-element')).map(card => { const position = card.querySelector('.job-element__body__title').innerText const company = card.querySelector('.job-element__body__company') .innerText
  • const description = card.querySelector('.job-element__body__details') .innerText const image = Array.from( document.querySelectorAll('.job-element__logo img'), card => card.dataset.src ? 'https://www.stepstone.de' + card.dataset.src : card.src ) })
  • @MarkusMühlerdt 我已经更新了我的答案,包括收集每个工作的职位、公司、描述和图像的解决方案。
  • 有效!这太棒了 - 非常感谢格兰特!
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 2020-01-09
  • 2021-09-06
  • 2014-08-10
  • 1970-01-01
相关资源
最近更新 更多