node.js - 在云功能上使用 puppeeter 进行长期工作
问题描述
我正在谷歌云平台上开发一些云功能。我需要抓取一个网页,然后我决定将 nodeJS 云功能与 Puppeteer 一起使用。
我的刮刀完成一项需要 1 到 3 分钟才能完成的工作。
我的想法是通过 API 调用触发函数,返回成功消息,然后抓取页面并将数据保存在数据库中。
以下是我的代码。
const puppeteer = require('puppeteer');
async function browserPromise() {
return await puppeteer.launch({
args: [
"--ignore-certificate-errors",
"--no-sandbox",
],
headless: true
})
}
exports.Runner = async (req, res) => {
const browser = await browserPromise();
const page = await browser.newPage();
await page.setViewport({width: 1200, height: 720});
scraper(browser, page, req.body)
res.json('OK')
}
async function scraper(browser, page, formdata) {
...do stuff...
}
问题是当我运行上面的代码时,我收到响应“OK”但刮板内的代码总是失败并出现以下错误
Error: Process exited with code 16
at process.<anonymous>
相反,如果我等待如下响应,它会起作用。
const data = await scraper(browser, page, req.body)
问题是,如果我使用上述方法,调用我的函数的客户端必须等待 1 分钟,然后才能看到超时消息。我想让客户看到一条成功的消息,然后在后台进行所有的抓取。
做我需要做的最好的方法是什么?
谢谢你。
解决方案
是的,初始化浏览器、创建页面和做其他你想做的事情都需要时间。
您需要检查哪些步骤花费的时间太长。
console.time('method1');
console.timeEnd('method1');
我正在使用这些参数:
var args = [
'--proxy-server='+proxy,
'--no-sandbox',
'--disable-gpu',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--no-first-run',
'--no-zygote',
'--single-process'
];
你必须使用
scraper(browser, page, req.body)
代替
await scraper(browser, page, req.body)
在响应发送之前
推荐阅读
- python - AssertionError:管理器项目的数量必须等于块项目的联合#管理器项目:6004,#tot_items:6005
- python - Python 3 Django Rest Framework - Manager 对象没有属性错误
- reactjs - SweetAlert2-react 取消按钮不起作用
- c# - Visual Studio 2019 C# Windows Forms App (.NET Framework) - 没有视图设计器或查看代码
- python - 使用opencv显示当前坐标圆而不是所有点
- sql - SQL - 获取行的 MIN 值并检查此 MIN 值是否在行中至少 2 次
- javascript - 如何解决 SassError:属性“enableProdMode”必须后跟“:”?
- c# - 记录使用单独程序执行的所有功能
- caching - 使用实体框架在 ASP.NET Core MVC 中的 IMemoryCache 中缓存实体本身
- java - 在 Android 中使用 Volley 提取数据