V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sunsh2017
V2EX  ›  Node.js

如何在 nodejs 里,把 puppeteer 做成一个 web 服务?

  •  
  •   sunsh2017 · 2018-03-09 21:09:04 +08:00 · 6922 次点击
    这是一个创建于 1570 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我想把 puppeteer,这个抓取网页的功能,做成一个 web 服务,具体来说,这个 web 服务接收两个参数,一个是网址 url,另一个是选择器 selector, web 服务接收这两个参数,然后 puppeteer 抓取这个 url,解析出 selector, 并返回 出这个 selector.
    大致代码如下 :

    const express = require('express')

    const app = express()

    app.get('/myurl/:url/:selector', function (req, res,page) {
      const puppeteer = require('puppeteer');
      var url=req.params.url;
      var selector=req.params.selector
     (async() => {
       const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
       const page = await browser.newPage();
       await page.goto('http://www.iciba.com/'+vocabulary);
       const html = await page.$eval(selector, e => e.outerHTML);
       browser.close();
       res.send(html);
     })();
    })

    app.listen(5000, function () {
    })


    但这个代码有致命问题,它每次都启动一次 puppeteer, 每次都开新标签,用完之后,每次都关闭标签 。能不能这些动作都做一次,每次都复用相同的标签页,来打个页面,各位 nodejs 高手有办法吗?
    yamedie
        1
    yamedie  
       2018-03-09 22:09:38 +08:00 via Android
    browser.pages[0] 可以取到第一个标签页,用完不关 page 就好了
    sunsh2017
        2
    sunsh2017  
    OP
       2018-03-09 22:25:18 +08:00
    楼上讲了正确的废话,talk is cheap, show me the code. 谁给出正确代码,我给那人发红包。
    sunsh2017
        3
    sunsh2017  
    OP
       2018-03-09 22:26:38 +08:00
    给出正确代码,我发红包。
    wangjie
        4
    wangjie  
       2018-03-09 22:42:07 +08:00
    const express = require('express')

    const app = express()
    let browser
    let page
    (async () => {
    browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
    page = await browser.newPage();
    })()

    app.get('/myurl/:url/:selector', function (req, res,page) {
      const puppeteer = require('puppeteer');
      var url=req.params.url;
      var selector=req.params.selector
     (async() => {
       await page.goto('http://www.iciba.com/'+vocabulary);
       const html = await page.$eval(selector, e => e.outerHTML);
       res.send(html);
     })();
    })

    app.listen(5000, function () {
    })
    sunsh2017
        5
    sunsh2017  
    OP
       2018-03-10 00:05:34 +08:00
    我试了下,@wangjie, 确实能运行,上面的代码可能有点错误 ,正确的代码如下:
    const express = require('express')

    const app = express();
    let browser;
    let page;
    (async () => {
    const puppeteer = require('puppeteer');
    browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
    page = await browser.newPage();
    })()

    app.get('/word/:vocabulary', function (req, res) {
    var url=req.params.url;
    var vocabulary=req.params.vocabulary;
    (async() => {
    await page.goto('http://www.iciba.com/'+vocabulary);
    const html = await page.$eval('div.article div.article-section', e => e.outerHTML);
    res.send(html);
    })();
    })

    app.listen(5000, function () {
    })


    确实可运行,@wangjie, 请提供你的支付宝帐号,给你发个小红包。 支付宝帐号,可用 base64 加密之。
    yamedie
        6
    yamedie  
       2018-03-10 07:38:48 +08:00 via Android   ❤️ 4
    @sunsh2017 你没什么毛病吧?你需要的思路讲给你听了你还说废话,你的代码你自己写就好了别人有义务看懂并帮你写代码?公主病?
    sunsh2017
        7
    sunsh2017  
    OP
       2018-03-10 09:06:34 +08:00 via Android
    @yamedie 你的思路就是错的 正确的提发是 你讲了错误的废话 不仅是废话 还是错误的 这里的问题是如何杜绝反复的发起 打开 关闭 你讲的啥玩意? 不提了 后人已给出代码 我也做了修正 别人是没义务 所以才要发红包 在 stackoverflow 上 人们通常是用代码作答 而不是思路 talk is cheap!
    yamedie
        8
    yamedie  
       2018-03-10 09:41:01 +08:00
    @sunsh2017 每次只操作同一个 browser 实例里的第一个 page, 永远不去 newPage(), 就根本不需要反复打开关闭了. 你不经思考就断言别人说的是废话, 我也是呵呵了跟你这种人讲道理. 还以为自己得到了最优解, 还 talk is cheap, 你咋不上天呢亲爱的?
    yamedie
        9
    yamedie  
       2018-03-10 09:45:04 +08:00
    @sunsh2017 我认为以你对 puppeteer 的理解, 只需要把.pages[0]这个关键点指给你就足够, 看来我错了.
    sunsh2017
        10
    sunsh2017  
    OP
       2018-03-10 10:17:32 +08:00
    @yamedie 你连题意都审不清楚,既使不反复打开 newpage, 这里还会反复 launch browser, 你自己错了,怎么不承认 呢,如果你自始自终坚持认为自己是对的,行,贴出代码来,我运行一次,即知真假,何必反复用自然语言去描述一个需要精准运作的代码片段? talk is cheap, show me the code !
    yamedie
        11
    yamedie  
       2018-03-10 10:20:23 +08:00
    @sunsh2017 我只告诉你只需要 launch 一次, 思路自己想, 伸手党, 我拒绝给你代码, 你已经得到最优解了行吧, 祝你好运.
    ihoey
        12
    ihoey  
       2018-03-10 10:24:38 +08:00 via Android   ❤️ 2
    @yamedie 这种只知道复制粘贴的人你理它干嘛呢,好好的周末心情都没了
    yamedie
        13
    yamedie  
       2018-03-10 10:28:26 +08:00
    @ihoey 感谢,心情好多了 (一大早还没起床就回答个问题,结果被说成是废话,v2ex 让我大开眼界
    sunsh2017
        14
    sunsh2017  
    OP
       2018-03-10 10:30:05 +08:00
    不理这些人便是。
    songjiaxin2008
        15
    songjiaxin2008  
       2018-03-10 10:31:51 +08:00 via iPhone
    pandorajs 了解一下
    sunsh2017
        16
    sunsh2017  
    OP
       2018-03-10 10:34:31 +08:00
    还复制,粘贴,上面的代码,在网上是无论如何都找不到的,包括 wangjie 的代码,也是不能正常运行的,我做出了修正,才能正常运行,但其大体思路是正确的,所以认为是个好答案。
    真是物以群分,人以类聚,真正的高手,都是一言不发,直接上代码,比如 wangjie,,反倒是叫得最响的,反而没啥真正本事。
    LosLord
        17
    LosLord  
       2018-03-10 10:41:41 +08:00 via Android
    好中二呀
    binux
        18
    binux  
       2018-03-10 10:46:01 +08:00   ❤️ 2
    @sunsh2017 “不能正常运行” 这样的提法表明你并不懂编程
    你只会复制粘贴,啪,运行了,great,啪,error,“不能正常运行”

    为什么你觉得 “真正的高手,都是一言不发,直接上代码”
    是因为你和他们交流的时候,根本不懂他们在说什么。人家只好 “直接上代码”,你复制粘贴,好问题解决。
    sunsh2017
        19
    sunsh2017  
    OP
       2018-03-10 10:54:01 +08:00 via Android
    @binux 你的意思 stackoverflow 整个网站都是错的 他们应该用自然语言来交流 ? 所谓程序 就是磨磨嘴皮 说下就行了? 所有的学术论文 不应该出现代码 用自然语言描述下就行了 所有的算法 思想 用自然语言描述就行了 书本上就不该出现任何代码 否则就是 low 逼的书
    misaka19000
        20
    misaka19000  
       2018-03-10 12:43:23 +08:00 via Android
    binux
        21
    binux  
       2018-03-10 12:44:44 +08:00
    @sunsh2017 stackoverflow 面向的就是你这样水平的啊,为了让你看懂,当然是代码了。
    反过来,论文就是很好的例子。如果你照着学术论文,能实现出同样的效果,算我输!
    Pastsong
        22
    Pastsong  
       2018-03-10 12:49:08 +08:00
    @sunsh2017 stackoverflow 直接上代码的回答都是因为问的问题太傻比了,跟你解释估计你也听不懂,两行代码自己拿去复制吧。这个问题就是这样的
    leslie000666
        23
    leslie000666  
       2018-03-10 13:18:34 +08:00 via Android
    思路 or code ?
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3353 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 05:13 · PVG 13:13 · LAX 22:13 · JFK 01:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.