javascript - 无法使用 pupette 从图像列表中获取 url
问题描述
我正在尝试使用 puppeteer 使用节点制作刮板,一切似乎都运行良好。我想得到一个看起来像这样的对象数组:
[{
title,
price,
link,
image,
}]
下面的代码完成了它,我很幸运,页面上有一个带有图像 src 的数据属性,并且能够像这样得到它:
img: item.querySelector('.imagebox').dataset.imgsrc,
.
不过我想知道为什么当我想得到这样的代码时这个代码会src
失败
image: item.querySelector('img').src,
这是我使用的代码和我要抓取的网站的网址。
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()
推荐阅读
- firebase - Flutter 中的 Cloud Firestore getAll() 等效项
- kubernetes - 尝试从 Web 客户端 (grpc-web) 调用 GRPC 服务器(在 GKE 上)时出现“404 未找到”
- wordpress - 古腾堡自定义元块不将元保存到自定义帖子类型
- android - 如何在颤振(android)应用程序中使用 C++ 代码?
- bash - Bash函数不回显附加参数
- sql - 分层查询显示每个父级下的所有子级
- javascript - 如何将此图像加载到自动完成文本框中?
- express - 使用 express-ntlm 身份验证对 TFS api 进行身份验证
- initialization - 选择一个理想的 CRC 初始值
- firebase - 编辑由 dialogflow 创建的 firebase 函数