无法使用 puppeteer 从图像列表中获取 url
Can't get url from list of images using pupetter
我正在尝试使用 node 使用 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.log(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()
提前感谢您的帮助
- 页面图像在滚动到视图中后立即延迟加载。所以我们需要滚动到它们并稍等片刻。
- 尽管如此,由于某些原因,一些图像仍未添加到 DOM,因此我们需要为这些情况添加检查。
您可以尝试这样的操作:
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.log(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()
我正在尝试使用 node 使用 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.log(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()
提前感谢您的帮助
- 页面图像在滚动到视图中后立即延迟加载。所以我们需要滚动到它们并稍等片刻。
- 尽管如此,由于某些原因,一些图像仍未添加到 DOM,因此我们需要为这些情况添加检查。
您可以尝试这样的操作:
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.log(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()