Как выбрать значение атрибута «srcset» с помощью javascript?

#javascript #html #node.js #puppeteer

Вопрос:

Я пытаюсь соскрести изображение(изображения) с pinterest со следующим кодом ниже: Модуль(ы) (кукловод). 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 => x.srcset)

вывод: Ничего не было выведено, оно было пустым

Ответ №1:

Можете ли вы попробовать следующий код? Он не тестируется, так как я не хотел реализовывать процесс входа в систему.

Что он делает, так это page.$$(selector) вызывает document.querySelectorAll() внутри страницы. Он возвращает массив ElementHandle. Вы должны быть в состоянии получить значение srcset атрибута, выполнив оценку node.getAttribute('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);
  }
}
 

Комментарии:

1. Я обновил ответ, заменив строку внутри for цикла. Первая версия была console.log(await img.getProperty('srcset')) . img.getProperty() Метод вернет JSHandle то, о чем нужно позаботиться еще раз, чтобы получить имя свойства. Обновленная версия должна возвращать строку.

2. Вот что произошло: браузер открылся с URL-адресом, который я использовал в качестве параметра. Браузер закрылся, и на консоль ничего не было выведено.

3. Сколько предметов page.$$("img[srcset]") возвращается? Вы можете проверить images.length это для меня?

4. он возвращает значение 0 ., в то время как моя исходная функция вернула 56.

5. Это, вероятно, означает, что в текущем состоянии страницы на ней нет img элемента с srcset атрибутом. Возможно, вам придется что-то сделать со страницей, после чего скрипт страницы динамически создаст элементы с srcset элементами. Может быть, прокрутите вниз или нажмите?