首页 > 解决方案 > 无法使用 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()

提前感谢您的帮助

标签: javascriptnode.jsweb-scrapingpuppeteer

解决方案


  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()

推荐阅读