Web scraping 用puppeter优化web抓取

Web scraping 用puppeter优化web抓取,web-scraping,puppeteer,Web Scraping,Puppeteer,我正在请求一个API,该API允许刮取网页 我使用expressJS和Postman进行测试,使用puppeter和cheerio进行刮片 它可以工作,但是当使用Postman进行测试时,请求的执行时间在8到13秒之间 我发现这花费了太多时间,我想知道这是否正常,因为我知道我还没有在生产中部署API, 我现在只在本地测试 我试着建立一个良好的关系 编辑 我编写了这个函数,带有异步/等待承诺,执行时间平均在2.5s到4s之间 看起来还需要时间 是否有其他方法优化此请求 我在媒体站点上使用的脚本示例

我正在请求一个API,该API允许刮取网页

我使用expressJS和Postman进行测试,使用puppeter和cheerio进行刮片

它可以工作,但是当使用Postman进行测试时,请求的执行时间在8到13秒之间

我发现这花费了太多时间,我想知道这是否正常,因为我知道我还没有在生产中部署API, 我现在只在本地测试

我试着建立一个良好的关系

编辑

我编写了这个函数,带有异步/等待承诺,执行时间平均在2.5s到4s之间

看起来还需要时间

是否有其他方法优化此请求

我在媒体站点上使用的脚本示例:

const puppeteer = require('puppeteer');

const scrapURL = (req, res, next) => {

  let url = req.query.url;

  puppeteer.launch({ headless:true }).
    then(async function(browser) {
        const page = await browser.newPage();

        await page.setRequestInterception(true);

        page.on('request', request => {
            if (request.resourceType() === 'document')  
                request.continue();
            else
            request.abort();
        });
    
        await page.goto(url);

        const data = await page.$eval("h1", element => element.innerText);

        await browser.close();

        return res.status(201).json({ data:data});
        
    })
   .catch(error => res.status(400).json({ error:error }))
  }

我刚刚用perf_hooks库执行了测试 关于木偶演员的剧本

请求的执行时间介于0.80 ms和1.24 ms之间

因此,是时候打开浏览器了,这需要时间

当我启动服务器时,我曾想过启动浏览器,但如果我做了几次抓取,每次都必须打开一个新页面


这会不会使流程变得繁琐并延长执行时间?

您可以将
$=cheerio.load…
的设置添加到您的代码axample中吗?否则,我们将无法运行您的代码段。问:使用Promissions而不是async/await语法有什么特别的原因吗?我导入了cheerio,然后我能够恢复url的标题h1,脚本工作了,只是我不明白为什么这个过程如此缓慢。我更新了我的帖子,还有两个问题:(1)你不是故意在抓取结束时关闭浏览器的吗?是否多次调用刮取脚本,以便重用打开的浏览器实例?(2) 我在问你为什么喜欢旧的js promise而不是async/await语法,因为它会让你的scraper脚本在使用Puppeter脚本时更加方便,但是如果你使用的是比Node 8更旧的版本,当然除了旧的promise格式,你别无选择。所以:async/await不是一个选项?顺便说一句,你不需要木偶演员的cheerio<代码>常量数据=$(“h1”,html).text()可以替换为
const data=wait page.$eval(“h1”,element=>element.innerText)。这消除了一个依赖项和用cheerio(Puppeter已经将HTML解析为DOM)重新解析HTML。如果这2.5-4s包括打开和关闭浏览器,这似乎是不可避免的延迟。也许您可以保留打开的浏览器并每次连接到它?