Javascript 使用空间';s Browsershot/Headless Chrome可捕捉超长屏幕截图
我会定期遇到需要使用Spatial来捕获非常高的网页的场景。但是,当我这样做时,结果屏幕截图每16384像素重复一次。(您可以在此处看到重复的示例:) 这是一个已知的木偶演员的限制(文献记载)。目前推荐的解决方法似乎是拍摄几个屏幕截图,并使用Javascript 使用空间';s Browsershot/Headless Chrome可捕捉超长屏幕截图,javascript,php,laravel,google-chrome-headless,Javascript,Php,Laravel,Google Chrome Headless,我会定期遇到需要使用Spatial来捕获非常高的网页的场景。但是,当我这样做时,结果屏幕截图每16384像素重复一次。(您可以在此处看到重复的示例:) 这是一个已知的木偶演员的限制(文献记载)。目前推荐的解决方法似乎是拍摄几个屏幕截图,并使用clip()以16384px的增量偏移屏幕截图。您可以使用Node.js看到这种方法的一个示例 现在,在客户端,这种方法似乎工作得很好,但在Browsershot库的上下文中,这并不能真正帮助我们。据我所知,在PHP中没有可行的方法获得页面的高度;有人能想到
clip()
以16384px的增量偏移屏幕截图。您可以使用Node.js看到这种方法的一个示例
现在,在客户端,这种方法似乎工作得很好,但在Browsershot库的上下文中,这并不能真正帮助我们。据我所知,在PHP中没有可行的方法获得页面的高度;有人能想到服务器端有什么潜在的解决办法来破解超长屏幕截图吗
我知道这并不是图书馆的预期用途,最终,这甚至不是图书馆的限制,但我想我还是把它扔掉吧。有了对Spatial的新贡献,你可以用你提供的方法轻松捕获非常高的网页
$url='1!'http://www.spiegel.de';
//获取模拟设备中主体的scrollWidth和scrollHeight
$browsershot=newbrowsershot($url,true);
$dimensions=$browsershot
->设备(“iPhone 6”)
->waitUntilNetworkIdle()//确保加载所有其他资源
->求值(“JSON.stringify({height:document.body.scrollHeight,width:document.body.scrollWidth})”;
$dimensions=json_解码($dimensions);
//iphone 6的比例因子等于2
// https://github.com/GoogleChrome/puppeteer/blob/master/DeviceDescriptors.js#L288
$dpr=2;
$maxScreenshotHeight=楼层(16*1024/$dpr);
对于($ypos=0;$ypos<$dimensions->height;$ypos+=$maxScreenshotHeight){
$height=min($dimensions->height-$ypos,$maxScreenshotHeight);
$browsershot=newbrowsershot($url,true);
$browsershot
->设备(“iPhone 6”)
->waitUntilNetworkIdle()
->剪辑(0,$ypos,$dimensions->width,$height)
->超时(120000)//处理超时
->保存('screenshot-@.$ypos.'px.png');
}
$url = 'http://www.spiegel.de';
//Get scrollWidth and scrollHeight of the body in the emulated device
$browsershot = new Browsershot($url, true);
$dimensions = $browsershot
->device('iPhone 6')
->waitUntilNetworkIdle() // ensuring all additional resources are loaded
->evaluate("JSON.stringify({height: document.body.scrollHeight, width: document.body.scrollWidth})");
$dimensions = json_decode($dimensions);
// iphone 6 scale factor is equal to 2
// https://github.com/GoogleChrome/puppeteer/blob/master/DeviceDescriptors.js#L288
$dpr = 2;
$maxScreenshotHeight = floor(16 * 1024 / $dpr);
for ($ypos = 0; $ypos < $dimensions->height; $ypos += $maxScreenshotHeight) {
$height = min($dimensions->height - $ypos, $maxScreenshotHeight);
$browsershot = new Browsershot($url, true);
$browsershot
->device('iPhone 6')
->waitUntilNetworkIdle()
->clip(0, $ypos, $dimensions->width, $height)
->timeout(120000) // handling timeout
->save('screenshot-@' . $ypos . 'px.png');
}