Я пытаюсь сделать парсер с помощью puppeteer с помощью узла, и все работает нормально. Я хочу получить массив объектов, выглядящий так:
[{
title,
price,
link,
image,
}]
и следующий код выполняет это, мне повезло, и на странице был атрибут данных с изображением src, и я смог получить его следующим образом:
img: item.querySelector('.imagebox').dataset.imgsrc,
.
Тем не менее, я хотел бы знать, почему этот код не работает, когда я хочу получить src
вот так
image: item.querySelector('img').src,
вот код, который я использую, и URL-адрес веб-сайта, который я пытаюсь очистить.
import puppeteer from 'puppeteer'
async function getHTML(url) {
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto(url)
const listItem = await page.evaluate(() =>
[...document.querySelectorAll('.aditem')].map(item => ({
title: item.querySelector('.text-module-begin').textContent.trim(),
price: item.querySelector('.aditem-details strong').textContent.trim(),
link: item.querySelector('.ellipsis').href,
img: item.querySelector('.imagebox').dataset.imgsrc,
image: item.querySelector('img').src,
}))
)
console.info(listItem)
await browser.close()
}
const searchArea = `s-kreuzberg`
const searchParam = `bike`
const url = `https://www.ebay-kleinanzeigen.de/${searchArea}/seite:1/${searchParam}/k0l3375r5`
async function go() {
await getHTML(url)
}
go()
заранее спасибо за любую помощь ??
Вы можете попробовать что-то вроде этого:
import puppeteer from 'puppeteer'
async function getHTML(url) {
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto(url)
const listItem = await page.evaluate(async () => {
function delay(ms) {
return new Promise((resolve) => { setTimeout(resolve, ms) })
}
const items = [...document.querySelectorAll('.aditem')]
for (const item of items) {
item.scrollIntoView()
await delay(100)
}
return items.map(item => ({
title: item.querySelector('.text-module-begin').textContent.trim(),
price: item.querySelector('.aditem-details strong').textContent.trim(),
link: item.querySelector('.ellipsis').href,
img: item.querySelector('.imagebox').dataset.imgsrc,
image: item.querySelector('img')? item.querySelector('img').src : null,
}));
}
)
console.info(listItem)
await browser.close()
}
const searchArea = `s-kreuzberg`
const searchParam = `bike`
const url = `https://www.ebay-kleinanzeigen.de/${searchArea}/seite:1/${searchParam}/k0l3375r5`
async function go() {
await getHTML(url)
}
go()
это сработало хорошо! Я продолжу использовать imgsrc
из соображений производительности, но было бы неплохо узнать, как это сделать для лениво загружаемых изображений. ??
Итак, подождите, вопрос в том, почему вы не можете получить изображение с помощью атрибута
src
? :)