有什么方法可以用PHP截图一个网站,然后保存到一个文件?
当前回答
如果你不想使用任何第三方工具,我遇到了一个简单的解决方案,那就是使用谷歌页面洞察api。
只需要调用它的api与params截图=true。
https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=https://stackoverflow.com/&key={your_api_key}&screenshot=true
对于移动站点视图传递&策略=移动参数,
https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=http://stackoverflow.com/&key={your_api_key}&screenshot=true&strategy=mobile
演示。
其他回答
我在Windows上,所以我能够使用imagegrabwindow函数在阅读stephan在这里的提示后。我添加了裁剪(以消除浏览器标题、滚动条等)和调整大小以获得最终图像。这是我的代码。希望这能帮助到别人。
有很多选择,它们都有各自的优点和缺点。以下是按实现难度排序的选项列表。
选项1:使用API(最简单)
ApiFlash(基于chrome) EvoPDF(有html选项) Grabzit ...
Pros
执行Javascript 近乎完美渲染 正确使用缓存选项时快速 缩放由api处理 精确计时,视口,… 大多数时候,他们提供的是免费方案
Cons
如果你打算经常使用它们,就不是免费的
选项2:使用众多可用库中的一个
dom-to-image Wkhtmltoimage(包含在wkhtmltopdf工具中) phpwkhtmltopdf ...
Pros
大多数时候,转换是相当快的
Cons
坏的呈现 不执行javascript 不支持最近的网页功能(FlexBox,高级选择器,网页字体,盒子大小,媒体查询,HTML5标签…) 有时不容易安装 缩放复杂
选项3:使用PhantomJs和包装器库
PhantomJs php- PhantomJs (phphtomjs包装器库) ...
Pros
执行Javascript 很快
Cons
坏的呈现 PhantomJs已弃用,不再维护。 不支持最近的网页功能(FlexBox,高级选择器,网页字体,盒子大小,媒体查询,HTML5标签…) 缩放复杂 不那么容易使它工作,如果有图像要加载…
选项4:使用Chrome Headless和一个包装器库
Chrome无头 chrome-devtools-protocol puphpeteer ...
Pros
执行Javascript 近乎完美渲染
Cons
要得到想要的结果并不容易: 页面加载时间 代理集成 自动滚动 ... 缩放复杂 相当慢,甚至更慢,如果html包含外部链接
免责声明:我是ApiFlash的创始人。我尽力提供了一个诚实而有用的答案。
我发现这是最好和最简单的工具:ScreenShotMachine。这是一项付费服务,但你可以得到100张免费截图,你还可以花20美元再买2000张,所以这是一笔相当划算的交易。它有一个非常简单的用法,你只是使用一个URL,所以我写了这个小脚本来保存一个基于它的文件:
<?php
$url = file_get_contents("http://api.screenshotmachine.com/?key={mykey}&url=https://stackoverflow.com&size=X");
$file = fopen("snapshots/stack.jpg", "w+");
fwrite($file, $url);
fclose($file);
die("saved file!");
?>
他们有一个非常好的文档,所以你一定要看看。
最后编辑:7年过去了,这个答案仍然得到了点赞,但我猜这个答案现在更准确了。
当然可以,但是您需要用一些东西来呈现页面。 如果你真的只想使用php,我建议你使用HTMLTOPS,它会渲染页面并将其输出到ps文件(ghostscript)中,然后将其转换为.jpg, .png, .pdf…对于复杂的页面可能会稍微慢一些(并且不支持所有的CSS)。
否则,你可以使用wkhtmltopdf输出一个html页面在pdf, jpg,无论什么。 接受CSS2.0,使用webkit (safari的包装器)来呈现页面。所以应该没问题。 你必须安装在你的服务器上,以及..
现在,有了新的HTML5和JS特性,也可以使用JavaScript将页面渲染成画布对象。这里有一个很好的库可以做到这一点:Html2Canvas,这里是由同一作者实现的,以获得类似G+的反馈。 一旦将dom渲染到画布中,就可以通过ajax发送到服务器,并将其保存为jpg格式。
编辑:你可以使用imagemagick工具将pdf转换为png。我的wkhtmltopdf版本不支持图像。例如:convert html.pdf -append html.png。
编辑:这个小shell脚本提供了一个简单的/但在linux上使用php5-cli和上面提到的工具的使用示例。
编辑:我现在注意到,wkhtmltopdf团队正在进行另一个项目:wkhtmltoimage,这给你的jpg直接
这完全取决于你想如何截屏。
你可以通过PHP,使用webservice来获取图像
grabz。它有一个webservice来做这件事,这里有一篇文章展示了一个使用该服务的简单示例。
http://www.phpbuilder.com/articles/news-reviews/miscellaneous/capture-screenshots-in-php-with-grabzit-120524022959.html
推荐文章
- 阻止人们入侵基于php的Flash游戏高分表的最佳方法是什么
- PHP子字符串提取。获取第一个'/'之前的字符串或整个字符串
- __construct函数的作用是什么?
- PHP中的异步shell执行器
- Laravel 5 -如何访问在视图存储上传的图像?
- 为什么在PHP中使用sprintf函数?
- “质量分配”在Laravel中是什么意思?
- 在逗号上爆炸字符串,并修剪每个值的潜在空格
- PHP与MySQL 8.0+错误:服务器请求身份验证方法未知的客户端
- laravel5“LIKE”对等物(雄辩的)
- 在函数中使用默认实参
- 转换php数组到Javascript
- PHP PDO:字符集,集名称?
- PHP函数生成slug (URL字符串)
- GCM与PHP(谷歌云消息传递)