使用Puppeteer

时间:2018-09-06 14:46:06

标签: javascript node.js puppeteer cheerio

我当时使用Cheerio查找网页中的最大图像。这是我使用的代码:

  const { src } = $('img')
      .map((i, el) => ({
        src: el.attribs.src,
        width: el.attribs.width ? Number(el.attribs.width.match(/\d+/)[0]) : -1,
      }))
      .toArray()
      .reduce((prev, current) => (prev.width > current.width ? prev : current));

但是,仅当img的宽度为inline时,它才有效。如果没有宽度,我将其宽度设置为-1并在排序时考虑

是否可以使用 Puppeteer 在没有这些黑客的情况下找到网页中最大的图像?由于浏览器正在呈现所有这些内容,因此可以轻松找出哪个是最大的

2 个答案:

答案 0 :(得分:3)

您可以使用page.evaluate()在Page DOM上下文中执行JavaScript,并将最大图像的src属性返回给Node / Puppeteer:

const largest_image = await page.evaluate(() => {
  return [...document.getElementsByTagName('img')].sort((a, b) => b.naturalWidth * b.naturalHeight - a.naturalWidth * a.naturalHeight)[0].src;
});

console.log(largest_image);

答案 1 :(得分:2)

您应该使用naturalWidthnaturlaHeight属性。

const image = await page.evaluate(() => {

  function size(img) {
    if (!img) {
      return 0;
    }
    return img.naturalWith * img.naturalHeight;
  }

  function info(img) {
    if (!img) {
      return null;
    }
    return {
      src:  img.src,
      size: size(img)
    }
  }

  function largest() {
    let best = null;
    let images = document.getElementsByTagName("img");
    for (let img of images) {
      if (size(img) > size(best)) {
        best = img
      }
    }
    return best;
  }

  return info(largest());
});