我正在尝试使用node的puppeteer进行刮板操作,一切似乎都正常。我想得到一个像这样的对象数组:
{
"_id" : ObjectId("5ca0e44acb216df65405dc5f"),
"items" : {
"0" : {
"id" : ObjectId("5c9fbb25e86deef65491c321"),
"active" : true
},
"1" : {
"id" : ObjectId("5c9fbb57cb216df65405dc5c"),
"active" : false
},
"2" : {
"id" : ObjectId("5c9fbb65cb216df65405dc5d"),
"active" : false
}
},
}
,下面的代码实现了这一点,我很幸运,页面上有一个图像属性为src的data属性,并且能够像这样获得它:
func CountRows(find interface{}) int {
session := database.GetMongoSession()
defer session.Close()
c := session.DB(config.Settings.Database.Name).C("list")
count, err := c.Find(find).Count()
if err != nil {
log.Fatal(err)
}
return count
}
func IsActive(oId bson.ObjectId, theId bson.ObjectId) bool {
if CountRows(bson.M{"_id": oId, "items": bson.M{"$elemMatch": bson.M{"id": theId , "active": true}}}) > 0 {
return true
}
return false
}
。
尽管如此,我想知道为什么当我想像这样获得[{
title,
price,
link,
image,
}]
时此代码会失败
img: item.querySelector('.imagebox').dataset.imgsrc,
这是我使用的代码以及我要抓取的网站的网址。
src
image: item.querySelector('img').src,
提前感谢您的帮助
答案 0 :(得分:1)
您可以尝试以下操作:
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()