#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
элементами. Может быть, прокрутите вниз или нажмите?