如何在 nodejs 里,把 puppeteer 做成一个 web 服务? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sunsh2017
V2EX    Node.js

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

  •  
  •   sunsh2017 2018-03-09 21:09:04 +08:00 7857 次点击
    这是一个创建于 2772 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我想把 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 browsr
    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 vi 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     Solana     1214 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 17:27 PVG 01:27 LAX 10:27 JFK 13:27
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86