【问题标题】:Trying to scrape websites using puppeteer and getting back empty objects尝试使用 puppeteer 抓取网站并取回空对象
【发布时间】:2020-12-25 16:42:02
【问题描述】:

我今天开始学习 puppeteer,但遇到了一个问题。我试图创建一个 covid 跟踪器,我想从 worldometers 中获取信息。但是当我尝试取回信息时,它会返回一个包含空对象的数组。对象的数量与具有相同类别的标签数量相匹配,但它不显示任何信息。这是我的代码

const puppeteer = require("puppeteer")
async function getCovidCases(){
    const browser = await puppeteer.launch({
        defaultViewport: null,
        headless: false,
        slowMo: 250
    })
    const page = await browser.newPage()
    const url = "https://www.worldometers.info/coronavirus/#countries"
    await page.goto(url, {waitUntil: 'networkidle0'})
    await page.waitForSelector(".navbar-nav", {visible: true})
    const results = await page.$$eval(".navbar-nav", rows => {
        return rows
    })
    await console.log(results)
}
getCovidCases()

有人知道该怎么做吗?

【问题讨论】:

  • 您对该页面的哪些数据感兴趣?
  • 任何。对于上面的示例,我使用了 navbar-nav。但我只是想知道我必须做什么才能在页面上获取任何信息。
  • 如果您要求any 数据,我提供了一个检索导航名称的工作示例。我可以帮助您检索其他数据,但如果您不具体,则不能。

标签: javascript node.js object async-await puppeteer


【解决方案1】:

根据选择器,我假设您在此步骤中对导航栏项目感兴趣。

    const results = await page.$$eval(".navbar-nav", navBars => {
      return navBars.map(navBar => {
        const anchors = Array.from(navBar.getElementsByTagName('a'));
        return anchors.map(anchor => anchor.innerText);
      });
    })

这会产生[ [ 'Coronavirus', 'Population' ] ],可能对您有用。

如果您只需要一个元素,请使用$eval,如果您需要多个元素,请使用$$eval。在回调中,您有对该 dom 元素的引用,但您不能直接返回它。如果你 console.log 任何东西,它都不会出现在 nodejs 终端中,而是出现在浏览器终端中。您返回的内容将被发送回nodejs,并且它需要可序列化(我认为)。你从navBar 得到的东西将被转换为一个空对象,而不是你想要的。这就是我映射它并将其转换为字符串 (innerText) 的原因。

如果你想抓取其他数据,你应该使用另一个选择器 (.nav-bar)。

【讨论】:

  • 我知道这是可行的,但是您到底做了什么,我必须做什么才能获得页面的另一部分?对不起,我只是新手,有点困惑
  • @TamirPolyakov 我扩展了我的答案,详细说明了它的工作原理以及您需要更改哪些内容才能获得页面的另一部分。
  • @TamirPolyakov 这回答了你的问题吗?
  • 对不起,我忘记回信了。是的,它帮助很大,谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多