[英]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;
}
您还应该注意以下几点:
title
、 link
、 resolve
和reject
脚本的头部,它们可能是由您的代码编辑器自动添加的。 摆脱它们,因为它们可能会覆盖实际变量。document.querySelector
更改为更具体,因为我无法从 ITC 网站选择实际元素。 您可能需要修改它们。希望我能帮上忙。 如果您遇到其他问题,请告诉我们。 欢迎来到 Stack Overflow 社区!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.