V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Hopetree
V2EX  ›  程序员

selenium 使用 PhantomJS 进行整个网页截图的 bug

  •  
  •   Hopetree ·
    Hopetree · 2018-04-29 17:52:13 +08:00 · 6353 次点击
    这是一个创建于 2395 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我使用 Python 控制 PhantomJS 来进行整个网页的截图的时候发现,当网页的总长度超过 32767px 的时候,截到的图片能够显示出来的长度最多只能到 32767px,后来查到 32767 这个数字是整形的最大值,所以,这个 bug 应该有一定的依据 ,请问有人试过吗?知道其中的原理吗?

    16 条回复    2018-04-30 18:56:56 +08:00
    larendorrx
        1
    larendorrx  
       2018-04-29 18:24:23 +08:00
    稍微搜了一下,14 年就有这个 bug 了,现在 issue 还是 open 的。。项目早就不维护了
    infun
        2
    infun  
       2018-04-29 18:44:55 +08:00 via iPhone
    pyvirtualdisplay
    terence4444
        3
    terence4444  
       2018-04-29 18:59:15 +08:00 via iPhone
    selenium 已经不打算继续支持 PhantomJS 了
    zeyexe
        4
    zeyexe  
       2018-04-29 19:53:26 +08:00
    换 Chrome headless 试试吧
    LosLord
        5
    LosLord  
       2018-04-29 20:04:16 +08:00 via Android
    自从 Chrome headless 出来后,phantom 的维护者就说了不打算继续维护了
    Hopetree
        6
    Hopetree  
    OP
       2018-04-29 22:33:35 +08:00
    @zeyexe
    @LosLord Chrome 和火狐的无头浏览器都只能截屏当前屏幕显示的页面,无法截屏长网页
    yh7gdiaYW
        7
    yh7gdiaYW  
       2018-04-29 22:44:30 +08:00
    换 Puppeteer 试试?
    murmur
        8
    murmur  
       2018-04-29 22:45:11 +08:00
    32767px 是干嘛 压力测瀑布流么
    creedowl
        9
    creedowl  
       2018-04-30 09:36:26 +08:00
    @zeyexe 请问 chrome-headless 为什么无法对单个元素截图?
    Hopetree
        10
    Hopetree  
    OP
       2018-04-30 10:32:42 +08:00
    @murmur 不是测试,我写了个整个网页截图的工具,就是为了截取整个网页
    cleveryun
        11
    cleveryun  
       2018-04-30 11:48:48 +08:00
    去年上半年有弄过在 node 下用 PhantomJS 截取整个网页,不过没有试过这么长的网页,我当时记得特别清楚的是这样截图好像特别慢,当时是对有数学公司的网页进行截图,初中高中数学题库一共下来几万(几十万?)张网页,用服务器跑了两三天才截完图片,好像平均截一张图要 6s 钟左右,太慢了。

    想问问楼主现在写的工具截图速度怎么样?
    zeyexe
        12
    zeyexe  
       2018-04-30 12:13:30 +08:00
    @creedowl 根据我搜索的结果来看,应该是 selenium 并没有实现根据 DOM 截图的接口,现有的解决办法是算出要截图的 DOM 在网页中的位置,然后截取整个页面,然后用第三方工具裁剪。
    creedowl
        13
    creedowl  
       2018-04-30 14:47:03 +08:00
    @zeyexe 应该是 chrome 的问题,我用 firefox-headless 就可以正常截取元素
    lamCJ
        14
    lamCJ  
       2018-04-30 15:25:37 +08:00 via iPhone
    这个问题我也遇到过 不是 phantomjs 的锅 同样的超长网页 我用专门浏览器截图插件 也截不完整甚至失败

    应该是浏览器遵守了某个图片格式的像素上限 导致一系列工具截不了

    SO 有个关于图片格式上限的讨论( 2 亿像素极限 一般程序能处理(误

    <https://stackoverflow.com/q/4109447/4696448>
    Hopetree
        15
    Hopetree  
    OP
       2018-04-30 17:26:48 +08:00
    @cleveryun 我用的多进程,算下来平均每个网页要 10 秒,当然,这个跟网页的长度有关,我截的图都是比较长的,如果短的就比较快 Github 代码: https://github.com/Hopetree/MyTools/tree/master/ScreenShot
    cleveryun
        16
    cleveryun  
       2018-04-30 18:56:56 +08:00
    @Hopetree 恩,你这么一说我想起来了,我当时是同时跑两个 node 程序,分别守护两个子进程,一共两个进程一起截图的,我的图片比较小,但是因为需要等页面加载完之后还得等 js 渲染好页面上的数学公式才可以截,所以都是页面加载后等 3 秒才去截图的(有一定概率会截图没渲染好的,但是比较少就没考虑了),所以平均一张 6 秒左右,那估计 phantomjs 截图的效率上限差不多就是 3 秒一张小图了。

    你的网站不错!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2692 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:30 · PVG 23:30 · LAX 07:30 · JFK 10:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.