【问题标题】:Calling puppeteer from rest api从 rest api 调用 puppeteer
【发布时间】:2019-09-13 01:27:45
【问题描述】:

是从休息端点调用 puppeteer 的适当方式吗?

Route.js

const express = require('express');

const PuppeteerController = require('../controllers/puppetter');

const router = express.Router();

router.post('/getPath', PuppeteerController.getPage);

Controller.js

async getPage(req, res) {
   try {
    let resp = await pageScanner.getPageContent(url);
    return res.status(200).send(resp);
   }
   catch(e) {
      return res.status(400).send({
        error: 'not-found'
      });
   }
}

扫描仪.js

async getPageContent(url) {
   try {
      const browser = await puppeteer.launch({
        args: [
          '--no-sandbox',
          '--disable-setuid-sandbox',
          '--disable-dev-shm-usage',
          '--disable-accelerated-2d-canvas',
          '--disable-gpu'
        ]
      });
      const page = await browser.newPage();
      await page.setViewport({ width: 800, height: 600 });
      await page.goto(url);
      await page.waitFor(1000);
      const pageContent = await page.content();
      await page.close();
      await browser.close();
      return pageContent;
   } catch(e) {
     return 'No good'
   }
}

这是最好的方法吗?如果我对该端点有多次点击,我会担心性能。

【问题讨论】:

    标签: rest api puppeteer


    【解决方案1】:

    是的,可以这样做。我建议使用 puppeteer 实例池来限制并行执行的数量。正如您已经注意到的,否则在大约同时有 10 个请求进入的情况下,您可能有 10 个打开的浏览器。

    查看库puppeteer-cluster(免责声明:我是作者),它支持您的用例。

    代码示例

    我从文档中的示例"Minimal screenshot server with express" 中获取了代码,并将其改编为您的用例。该代码创建了一个具有多个浏览器的集群(您可以使用多少并行实例,取决于您机器的 CPU/内存/吞吐量)并生成一个快速服务器来处理传入请求。抓取的网址由参数?url=...给出:

    const express = require('express');
    const app = express();
    const { Cluster } = require('puppeteer-cluster');
    
    (async () => {
        const cluster = await Cluster.launch({
            concurrency: Cluster.CONCURRENCY_BROWSER,
            maxConcurrency: 4,
        });
    
        // setup the function to be executed for each request
        await cluster.task(async ({ page, data: url }) => {
            await page.goto('http://' + url);
            // ...
            return await page.content();
        });
    
        // setup server
        app.get('/', async function (req, res) { // expects URL to be given by ?url=...
            try {
                // run the task function for the URL
                const resp = await cluster.execute(req.query.url);
                // respond with the result
                res.status(200).send(resp);
            } catch (err) {
                // catch error
                res.end('Error: ' + err.message);
            }
        });
    
        app.listen(3000, function () {
            console.log('Server listening on port 3000.');
        });
    })();
    

    【讨论】:

    猜你喜欢
    • 2018-10-29
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2011-11-01
    • 2012-07-24
    • 2020-11-08
    • 2020-07-26
    • 1970-01-01
    相关资源
    最近更新 更多