【问题标题】:Capture screenshot with phantomjs on a page with overlay在带有叠加层的页面上使用 phantomjs 捕获屏幕截图
【发布时间】:2016-01-05 13:40:58
【问题描述】:

我正在尝试将网站的特定 div 捕获到屏幕截图中,以方便我必须做的一些繁重的工作。到目前为止,我正在使用我在这个完全相同的网站上找到的这段代码,它正在有点工作:

var page = require('webpage').create();

page.open('http://www.example.org', function() {
  // being the actual size of the headless browser
  page.viewportSize = { width: 1440, height: 900 };

  var clipRect = page.evaluate(function(){
    return document.querySelector("div.example").getBoundingClientRect();
  });

  page.clipRect = {
    top:    clipRect.top,
    left:   clipRect.left,
    width:  clipRect.width,
    height: clipRect.height
  };

  page.render('google.png');
  phantom.exit();
});

这确实有效,但我有两个问题:

1) 页面在第一次访问时有一个叠加层,一种出现在屏幕截图上的弹出式窗口。 2)图像显然是下载的,因为它们需要渲染(它们只在网页上滚动时出现)

所以最后我得到了这样的结果: problem

我没有使用 phantomjs 的经验,所以我不知道如何解决这个问题。消除覆盖 DIV 并以某种方式在截屏之前强制加载图像可能会起作用,但我不知道如何实际编码。

非常感谢!

【问题讨论】:

  • 您是否可以控制要抓取的网站?即代码...
  • 我认为有两种方法可以解决这个问题。如果您可以控制目标网站代码,那么您可以将回调放在与 phantomjs 对话的 javascript 中。如果您无法控制,那么最好使用超时来等待页面完成加载所有内容......
  • 打开 wep 页面,获取特定的覆盖容器并将 css 更改为 display:none,然后将页面呈现为图像。您也可以通过更改滚动位置来向下滚动。检查链接http://phantomjs.org/api/webpage/property/scroll-position.html
  • 没有控制,知道如何实现滚动吗?这是唯一剩下的东西,感谢您的帮助!

标签: javascript phantomjs


【解决方案1】:

您可以以编程方式删除覆盖元素,以像素为单位设置页面滚动位置,等待几秒钟以加载图像,然后进行屏幕截图。

var page = require('webpage').create();

page.viewportSize = { width: 1440, height: 900 };

page.open('http://www.jovago.com', function() {

    // jQuery is used at the target site
    page.evaluate(function(){
        $("#overlay, #modal").remove();
    });

    // Simulate scrolling down
    page.scrollPosition = {
        top: 1400,
        left: 0
    };    

    var clipRect = page.evaluate(function(){
        return document.querySelector("div.top-destinations-homepage.promo-banners-box").getBoundingClientRect();
    });

    page.clipRect = {
        top:    clipRect.top,
        left:   clipRect.left,
        width:  clipRect.width,
        height: clipRect.height
    };

    // Wait 10 seconds for images to download
    setTimeout(function(){
          page.render('jovago.png');
          phantom.exit();
    }, 10000);

});

【讨论】:

  • 非常感谢伙计!现在可以工作,我仍然遇到页面无法按时加载图像的问题,但我会在截屏之前尝试在 phantomjs 上滚动。任何想法如何实施?你是救生员,谢谢!
  • 使用滚动代码更新了答案。图像现已到位:imgur.com/x15Js9V P.S.如果答案有用,别忘了点赞并采纳! )
  • @ptolos:您是否能够像您发布的示例一样滚动,还是动态滚动?如果事先不知道页面的高度,如何滚动?屏幕截图如何查找网站angular.io
猜你喜欢
  • 1970-01-01
  • 2015-05-16
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多