【问题标题】:How to select value of a "srcset" attribute with javascript?如何使用 javascript 选择“srcset”属性的值?
【发布时间】:2021-10-13 08:05:41
【问题描述】:

我正在尝试使用以下代码从 pinterest 上抓取图像:Module(s) (puppeteer)。 src 属性返回每个图像的最小尺寸,我知道实际尺寸要大得多。这在srcset 属性中很明显,其中最后一个字符串具有原始图像及其原始大小。我只是不知道如何选择最后一个字符串,这就是我想要的。怎么选?

async function scrapePage(url) {
    try {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto(url);

        const images = await page.$$eval("img", imgs => {
            return imgs.map(x => x.src)
        });

        for (const photo of images) {
            console.log(photo)
        }

        await browser.close();
    } catch (err) {
        console.log("Error Found: " + err);
    }
}

一张图片的元素:

<img alt="This contains an image of: {{ pinTitle }}" class="hCL kVc L4E MIw" importance="auto"
 loading="auto" src="https://i.pinimg.com/236x/2c/9c/e7/2c9ce7fb090051e25a4983474ede2b86.jpg"
 srcset="https://i.pinimg.com/236x/2c/9c/e7/2c9ce7fb090051e25a4983474ede2b86.jpg 1x,
 https://i.pinimg.com/474x/2c/9c/e7/2c9ce7fb090051e25a4983474ede2b86.jpg 2x, 
https://i.pinimg.com/736x/2c/9c/e7/2c9ce7fb090051e25a4983474ede2b86.jpg 3x, 
https://i.pinimg.com/originals/2c/9c/e7/2c9ce7fb090051e25a4983474ede2b86.jpg 4x">

输出:

https://i.pinimg.com/236x/fa/84/ac/fa84acd127ecdbe42fa6d15b33f3336f.jpg
https://i.pinimg.com/236x/ab/2d/43/ab2d43d73cd57d0112768257f81058e7.jpg
https://i.pinimg.com/236x/39/9e/23/399e23b9c5bc9ba0dbece7538ed114f1.jpg
https://i.pinimg.com/236x/d3/37/bd/d337bd8466e3946bad14118b37403831.jpg
https://i.pinimg.com/236x/fb/19/ba/fb19bac40a682a8dd942ea90ea188a2a.jpg
...

编辑: return imgs.map(x =&gt; x.srcset)

输出: 什么都没有输出,它是空的

【问题讨论】:

    标签: javascript html node.js puppeteer


    【解决方案1】:

    你能试试下面的代码吗?由于我不想实现登录过程,因此未进行测试。

    它的作用是page.$$(selector) 在页面内调用document.querySelectorAll()。它返回ElementHandle 的数组。您应该能够通过评估页面内的node.getAttribute('srcset') 来获取srcset 属性的值。

    我希望它有效!

    async function scrapePage (url) {
      try {
        const browser = await puppeteer.launch({ headless: false });
        const page = await browser.newPage();
        await page.goto(url);
    
        const images = await page.$$("img[srcset]");
    
        for (let img of images) {
          console.log(await img.evaluate((node) => node.getAttribute('srcset')));
        }
    
        await browser.close();
      } catch (err) {
        console.log("Error Found: " + err);
      }
    }
    

    【讨论】:

    • 我通过替换 for 循环内的行来更新答案。第一个版本是console.log(await img.getProperty('srcset'))img.getProperty() 方法将返回 JSHandle ,需要再次注意以获取属性名称。更新后的版本应该返回一个字符串。
    • 发生了这样的事情:浏览器以我用作参数的 URL 打开。浏览器关闭,没有任何内容输出到控制台。
    • page.$$("img[srcset]") 返回多少项?你能帮我查一下images.length吗?
    • 它返回值0.,而我原来的函数返回56。
    • 这可能意味着在页面的当前状态下,它没有具有srcset 属性的img 元素。您可能必须对页面做一些事情,然后页面的脚本会动态创建带有srcset 元素的元素。也许向下滚动或点击?
    猜你喜欢
    • 1970-01-01
    • 2019-03-15
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2013-07-20
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多