繁体   English   中英

使用 puppeteer 将网页抓取的数据上传到 node.js 中的 Firebase 云存储

[英]Upload webscraped data with puppeteer to firebase cloud storage in node.js

我正在尝试抓取新闻网站,打开文章的每个链接并获取数据。 我能够使用 puppeteer 进行网络抓取,但无法将其上传到 Firebase 云存储。 我如何每小时左右这样做? 我在异步函数中进行网页抓取,然后在云函数中调用它:我使用 puppeteer 从新闻编辑室网站抓取文章的链接,然后使用这些链接从文章中获取更多信息。 我首先将所有内容都放在一个异步函数中,但云函数抛出了一个错误,即循环中不应有任何等待。

更新:

我在 firebase 函数中植入了上面的代码,但仍然在循环错误中出现 no-await。

这里有几件事情是错误的,但您正走在一条正确的道路上,让它发挥作用。 主要问题是,您不能在try {} catch {}块中使用await 异步 JavaScript 有一种不同的处理错误的方式。 请参阅: 带有 async/await 的 try/catch 块

在您的情况下,在一个异步函数中编写所有内容完全没问题。 这是我将如何做到的:

async function scrapeIfc() {
  const completeData = [];
  const url = 'https://www.ifc.org/wps/wcm/connect/news_ext_content/ifc_external_corporate_site/news+and+events/pressroom/press+releases';

  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url);
  await page.setDefaultNavigationTimeout(0);

  const links = await page.evaluate(() =>
    Array.from(document.querySelectorAll('h3 > a')).map(anchor => anchor.href)
  );

  for (const link of links) {
    const newPage = await browser.newPage();
    await newPage.goto(link);

    const data = await newPage.evaluate(() => {
      const titleElement = document.querySelector('td[class="PressTitle"] > h3');
      const contactElement = document.querySelector('center > table > tbody > tr:nth-child(1) > td');
      const txtElement = document.querySelector('center > table > tbody > tr:nth-child(2) > td');

      return {
        source: 'ITC',
        title: titleElement ? titleElement.innerText : undefined,
        contact: contactElement ? contactElement.innerText : undefined,
        txt: txtElement ? txtElement.innerText : undefined,
      }
    })

    completeData.push(data);
    newPage.close();
  }

  await browser.close();

  return completeData;
}

您还应该注意以下几点:

  • 您有一堆未使用的导入titlelinkresolvereject脚本的头部,它们可能是由您的代码编辑器自动添加的。 摆脱它们,因为它们可能会覆盖实际变量。
  • 我将您的document.querySelector更改为更具体,因为我无法从 ITC 网站选择实际元素。 您可能需要修改它们。
  • 对于本地开发,我使用 Google 的functions-framework ,它可以帮助我在部署之前在本地运行和测试该功能。 如果您在本地机器上出现错误,则在部署到 GCP 时会出现错误。
  • (意见)如果您不需要 Firebase,我会使用 Google Cloud Functions、Cloud Scheduler 和 Cloud Firestore 运行它。 对我来说,这是定期网页抓取的首选工作流程。
  • (意见)Puppeteer 抓取一个简单的静态网站可能有点矫枉过正,因为它在无头浏览器中运行。 Cheerio 之类的东西更轻巧,速度也更快。

希望我能帮上忙。 如果您遇到其他问题,请告诉我们。 欢迎来到 Stack Overflow 社区!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM