无法使用伪造者从图像列表中获取网址

时间:2019-04-09 19:51:15

标签: javascript node.js web-scraping puppeteer

我正在尝试使用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,

提前感谢您的帮助

1 个答案:

答案 0 :(得分:1)

  1. 页面图像在滚动到视图中后即被延迟加载。因此,我们需要滚动到它们并稍等片刻。
  2. 即使那样,由于某些原因某些图像也没有添加到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()