有什么方法可以用PHP截图一个网站,然后保存到一个文件?
当前回答
我发现这是最好和最简单的工具: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!");
?>
他们有一个非常好的文档,所以你一定要看看。
其他回答
好吧,PhantomJS是一个可以很容易地放在服务器上并与php集成的浏览器。您可以在WDudes中找到代码。他们包括了更多的功能,如指定图像大小,缓存,下载为文件或显示在img src等。
<img src=”screenshot.php?url=google.com” />
URL参数
宽度和高度:截图.php?url=google.com&w=1000&h=800 裁剪: screenshot.php ? url = google.com&w = 1000 h = 800 &clipw = 800 &cliph = 600 关闭缓存并加载新截屏: screenshot.php ? url = google.com&cache = 0 下载图片:screenshot.php?url=google.com&download=true
你可以在这里看到教程:使用PHP不带API抓取一个网站的截图
有许多开源项目可以生成屏幕截图。例如PhantomJS, webkit2png等
这些项目的最大问题是,它们基于旧的浏览器技术,在渲染许多网站时存在问题,特别是在过去几个月/几年里使用webfonts、flexbox、svg和其他各种添加到HTML5和CSS规范的网站。
我尝试了一些第三方服务,大多数都是基于PhantomJS的,这意味着它们的截图质量也很差。生成网站截图的最好的第三方服务是urlbox.io。这是一项付费服务,但也有7天的免费试用,无需承诺任何付费计划。
这里是文档的链接,下面是让它在PHP中使用composer工作的简单步骤。
// 1 . Get the urlbox/screenshots composer package (on command line):
composer require urlbox/screenshots
// 2. Set up the composer package with Urlbox API credentials:
$urlbox = UrlboxRenderer::fromCredentials('API_KEY', 'API_SECRET');
// 3. Set your options (all options such as full page/full height screenshots, retina resolution, viewport dimensions, thumbnail width etc can be set here. See the docs for more.)
$options['url'] = 'example.com';
// 4. Generate the Urlbox url
$urlboxUrl = $urlbox->generateUrl($options);
// $urlboxUrl is now 'https://api.urlbox.io/v1/API_KEY/TOKEN/png?url=example.com'
// 5. Now stick it in an img tag, when the image is loaded in browser, the API call to urlbox will be triggered and a nice PNG screenshot will be generated!
<img src="$urlboxUrl" />
例如,这里是这个页面的全高截图:
https://api.urlbox.io/v1/ca482d7e-9417-4569-90fe-80f7c5e1c781/8f1666d1f4195b1cb84ffa5f992ee18992a2b35e/png?url=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F757675%2Fwebsite-screenshots-using-php%2F43652083%2343652083&full_page=true
有一些方法可以在PHP中实现这一点,但实际上,最好将其委托给非基于PHP的API,您可以自己构建,也可以付费购买。许多人已经在答案中列出了截图api,你可以使用其中任何一个来实现这一点。我自己的截图API经过了非常好的测试,涵盖了大多数API没有涵盖的许多渲染情况,但对大多数人来说,这是多余的,老实说。
我的建议是使用Puppeteer构建自己的API,这是目前构建截图解决方案的规范解决方案。我的服务是建立在Puppeteer的基础上的,对于大多数基本的用例来说,它真的工作得很好。
您可以使用https://www.npmjs.com/package/chrome-aws-lambda之类的东西在AWS或GCP上构建一个无服务器的Puppeteer解决方案,这是一个优秀的无服务器Puppeteer包,它预装了Chromium。
我最后按照@boksiora的建议使用microweber/screen进行设置。 最初当尝试这里提到的链接时,我得到了什么:
Please download this script from here https://github.com/microweber/screen
我用的是Linux。所以如果你想运行它,你可以根据你的环境调整我的步进。 下面是我在shell上DOCUMENT_ROOT文件夹上做的步骤:
$ sudo wget https://github.com/microweber/screen/archive/master.zip
$ sudo unzip master.zip
$ sudo mv screen-master screen
$ sudo chmod +x screen/bin/phantomjs
$ sudo yum install fontconfig
$ sudo yum install freetype*
$ cd screen
$ sudo curl -sS https://getcomposer.org/installer | php
$ sudo php composer.phar update
$ cd ..
$ sudo chown -R apache screen
$ sudo chgrp -R www screen
$ sudo service httpd restart
将浏览器指向screen/demo/shot.php?url=google.com。当你看到屏幕截图时,你就完成了。更多高级设置的讨论可在这里和这里。
我用的是bluga。该api允许你每月免费拍摄100张快照,但有时它会为单个页面使用超过1个积分。我刚刚升级了drupal模块,Bluga WebThumbs到drupal7,它允许你在模板或输入过滤器中打印缩略图。
使用这个api的主要优点是,它允许你指定浏览器尺寸,以防你使用自适应css,所以我使用它来获得移动和平板电脑布局以及常规布局的渲染。
有以下语言的api客户端:
PHP, Python, 红宝石, Java, net c#, Perl 和Bash (shell脚本看起来需要perl)
推荐文章
- 原则-如何打印出真正的sql,而不仅仅是准备好的语句?
- 如何从关联PHP数组中获得第一项?
- PHP/MySQL插入一行然后获取id
- 我如何排序一个多维数组在PHP
- 如何在PHP中截断字符串最接近于一定数量的字符?
- PHP错误:“zip扩展名和unzip命令都没有,跳过。”
- Nginx提供下载。php文件,而不是执行它们
- Json_encode()转义正斜杠
- 如何在PHP中捕获cURL错误
- 如何要求一个分叉与作曲家?
- 如何在php中创建可选参数?
- 在文本文件中创建或写入/追加
- 为什么PHP的json_encode函数转换UTF-8字符串为十六进制实体?
- 如何从一个查询插入多行使用雄辩/流利
- 在PHP单元测试执行期间,如何在CLI中输出?