418

有没有办法在 PHP 中截取网站的屏幕截图,然后将其保存到文件中?

4

18 回答 18

288

最后编辑: 7 年后,我仍然对这个答案表示赞成,但我想这个答案现在要准确得多。


当然可以,但是你需要用一些东西来渲染页面。如果您真的只想使用 php,我建议您使用HTMLTOPS,它会渲染页面并将其输出为 ps 文件(ghostscript),然后将其转换为 .jpg、.png、.pdf .. 可能会慢一点复杂的页面(并且不支持所有的 CSS)。

否则,您可以使用wkhtmltopdf以 pdf、jpg 等格式输出 html 页面。接受 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

于 2009-04-16T19:48:50.847 回答
88

从 PHP 5.2.2开始,可以仅使用 PHP 捕获网站

imagegrabscreen — 捕获整个屏幕

<?php
$img = imagegrabscreen();
imagepng($img, 'screenshot.png');
?>

imagegrabwindow - 使用窗口句柄(COM 实例中的 HWND 属性)抓取窗口或其客户区

<?php
$Browser = new COM('InternetExplorer.Application');
$Browserhandle = $Browser->HWND;
$Browser->Visible = true;
$Browser->Fullscreen = true;
$Browser->Navigate('http://www.stackoverflow.com');

while($Browser->Busy){
  com_message_pump(4000);
}

$img = imagegrabwindow($Browserhandle, 0);
$Browser->Quit();
imagepng($img, 'screenshot.png');
?>

编辑:请注意,这些功能仅在 Windows 系统上可用!

于 2010-12-24T14:31:30.283 回答
58

如果您不想使用任何第三方工具,我遇到了使用Google Page Insight api 的简单解决方案。

只需要使用 params 调用它的 api 即可screenshot=true

https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=https://stackoverflow.com/&key={your_api_key}&screenshot=true

对于参数中的移动站点视图传递&strategy=mobile

https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=http://stackoverflow.com/&key={your_api_key}&screenshot=true&strategy=mobile

演示

于 2014-03-12T05:36:21.030 回答
19

您可以使用简单的无头浏览器(例如 PhantomJS)来抓取页面。

您也可以将 PhantomJS 与 PHP 一起使用。

查看执行此操作的这个小 php 脚本。看看这里https://github.com/microweber/screen

这是 API - http://screen.microweber.com/shot.php?url=https://stackoverflow.com/questions/757675/website-screenshots-using-php

于 2013-08-07T07:27:24.977 回答
5

有很多选择,它们都有自己的优点和缺点。以下是按实施难度排序的选项列表。

选项 1:使用 API(最简单)

优点

  • 执行 Javascript
  • 近乎完美的渲染
  • 正确使用缓存选项时速度快
  • 规模由 API 处理
  • 精确的时间,视口,...
  • 大多数时候他们提供免费计划

缺点

  • 如果您打算大量使用它们,则不是免费的

选项 2:使用众多可用库之一

优点

  • 大多数时候转换速度很快

缺点

  • 渲染不良
  • 不执行 javascript
  • 不支持最近的 Web 功能(FlexBox、高级选择器、Webfonts、Box Sizing、媒体查询、HTML5 标签...)
  • 有时不那么容易安装
  • 规模复杂

选项 3:使用 PhantomJs 和包装库

优点

  • 执行 Javascript
  • 蛮快

缺点

  • 渲染不良
  • PhantomJs 已被弃用,不再维护。
  • 不支持最近的 Web 功能(FlexBox、高级选择器、Webfonts、Box Sizing、媒体查询、HTML5 标签...)
  • 规模复杂
  • 如果要加载图像,要让它工作就不是那么容易了……

选项 4:使用 Chrome Headless 和包装库

优点

  • 执行 Javascript
  • 近乎完美的渲染

缺点

  • 获得关于以下方面的确切结果并不容易:
    • 页面加载时间
    • 代理集成
    • 自动滚动
    • ...
  • 规模复杂
  • 如果 html 包含外部链接,则相当慢甚至更慢

免责声明:我是 ApiFlash 的创始人。我尽我所能提供一个诚实和有用的答案。

于 2019-03-07T14:05:46.973 回答
5

嗯,PhantomJS 是一个浏览器,可以很容易地放在服务器上并将其集成到 php 中。您可以在 WDudes 中找到代码。它们包含更多功能,例如指定图像大小、缓存、下载为文件或在 img src 中显示等。

<img src=”screenshot.php?url=google.com” />

网址参数

  • 宽高:screenshot.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

您可以在此处查看教程:Capture Screenshot of a Website using PHP without API

于 2015-12-30T01:19:13.380 回答
4

cutycapt 将网页保存为大多数图像格式(jpg,png ..)从您的突触下载它,它比 wkhtmltopdf 好得多

于 2013-08-19T19:10:11.063 回答
3

有很多开源项目可以生成截图。例如 PhantomJS、webkit2png 等

这些项目的最大问题是它们基于较旧的浏览器技术,并且在渲染许多网站时存在问题,尤其是在过去几个月/几年中使用 webfonts、flexbox、svg 以及 HTML5 和 CSS 规范的各种其他补充的网站。

我尝试了一些第三方服务,大多数都是基于 PhantomJS,这意味着它们也会生成质量很差的屏幕截图。生成网站截图的最佳第三方服务是urlbox.io。这是一项付费服务​​,尽管有 7 天的免费试用期可以在不承诺任何付费计划的情况下对其进行测试。

这是文档的链接,下面是使用 Composer 在 PHP 中工作的简单步骤。

// 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使用--%php 2F43652083%2343652083&full_page=true

由 urlbox.io 提供支持的 stackoverflow.com 问题的整页截图

于 2017-04-27T08:07:14.893 回答
3

我最终使用@boksiora 提出的 microweber/screen进行设置。
最初在这里尝试提到的链接时,我得到了:

Please download this script from here https://github.com/microweber/screen

我在Linux上。所以如果你想运行它,你可以根据你的环境调整我的步骤。
这是我在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. 当你看到截图时,你就完成了。更多高级设置的讨论可在此处此处获得。

于 2016-02-10T18:28:08.817 回答
2

我在 Windows 上,所以在阅读了 stephan 的提示后,我能够使用 imagegrabwindow 功能。我添加了裁剪(以摆脱浏览器标题、滚动条等)和调整大小以获得最终图像。这是我的代码。希望对某人有所帮助。

于 2011-05-13T15:58:55.227 回答
1

这完全取决于您希望如何截取屏幕截图。

您可以通过 PHP 执行此操作,使用 Web 服务为您获取图像

grabz.it 有一个网络服务可以做到这一点,这里有一篇文章展示了一个使用该服务的简单示例。

http://www.phpbuilder.com/articles/news-reviews/miscellaneous/capture-screenshots-in-php-with-grabzit-120524022959.html

于 2012-07-16T10:50:05.283 回答
1

我用过布鲁加。该 api 允许您每月拍摄 100 张快照而无需付费,但有时它会为单个页面使用超过 1 个积分。我刚刚将一个 drupal 模块Bluga WebThumbs升级到了 drupal 7,它允许您在模板或输入过滤器中打印缩略图。

使用此 api 的主要优点是它允许您在使用自适应 css 的情况下指定浏览器尺寸,因此我使用它来获取移动设备和平板电脑布局以及常规布局的渲染。

有以下语言的 api 客户端:

PHPPythonRubyJava.Net C#PerlBash(shell 脚本看起来需要 perl)

于 2012-03-18T10:45:03.860 回答
0

在网上冲浪了很多之后,我发现了这个。

PPTRAAS > 通过将 URL 作为参数传递来捕获屏幕截图的免费工具

他们只需点击其 URL 即可提供多种选择。

  1. 获取整页截图

    https://pptraas.com/screenshot?url= {您在此处的网址}

  2. 获取特定大小的页面截图

    https://pptraas.com/screenshot?url= {您的网址}&size=400,400

  3. 甚至可以将页面转换为 pdf

    https://pptraas.com/pdf?url= {您在此处的网址}

于 2019-04-27T11:50:14.387 回答
0

您可以使用https://grabz.it解决方案。

它有一个非常灵活的 PHP API,可以通过不同的方式调用,例如从 cronjob 或 PHP 网页调用。

为了实现它,您首先需要获取应用程序密钥和秘密下载(免费)SDK。

和一个实施的例子。首先初始化:

include("GrabzItClient.class.php");

// Create the GrabzItClient class
// Replace "APPLICATION KEY", "APPLICATION SECRET" with the values from your account!
$grabzIt = new GrabzItClient("Sign in to view your Application Key", "Sign in to view your Application Secret");

和截图示例:

// To take a image screenshot
$grabzIt->URLToImage("http://www.google.com");  
// Or to take a PDF screenshot
$grabzIt->URLToPDF("http://www.google.com");
// Or to convert online videos into animated GIF's
$grabzIt->URLToAnimation("http://www.example.com/video.avi");
// Or to capture table(s)
$grabzIt->URLToTable("http://www.google.com");

接下来是保存。您可以使用两种保存方法之一,Save如果可公开访问的回调句柄可用,SaveTo否则。检查文档以获取详细信息

于 2017-06-14T07:20:20.700 回答
0

有一些方法可以在 PHP 中实现这一点,但实际上最好将其委托给非 PHP 的 API,您可以自己构建或付费。许多人已经在答案中列出了屏幕截图 API,您可以使用其中任何一个来实现这一点。我自己的屏幕截图 API经过了非常好的测试,涵盖了大多数 API 未涵盖的许多渲染案例,但老实说,对于大多数人来说,这太过分了。

我的建议是使用 Puppeteer 构建您自己的 API,这是当今构建屏幕截图解决方案的规范解决方案。我的服务 GetScreenshot 建立在 Puppeteer 之上。

您可以使用https://www.npmjs.com/package/chrome-aws-lambda之类的东西在 AWS 或 GCP 上构建无服务器 Puppeteer 解决方案,这是一个预装 Chromium 的优秀 Puppeteer 无服务器包。

于 2021-07-23T02:41:16.067 回答
-1

不是直接的。Selenium 之类的软件具有这样的功能,可以由 PHP 控制,但具有其他依赖项(例如在您要截屏的浏览器的计算机上运行其基于 java 的服务器)

于 2009-04-16T19:31:22.977 回答
-1

你可以使用 cutycapt 。

kwhtml 已弃用,并像旧浏览器一样显示页面。

于 2016-11-22T20:56:34.763 回答
-1

我发现这是最好和最简单的工具:ScreenShotMachine。这是一项付费服务​​,但您可以获得 100 个免费屏幕截图,并且您可以以(约)20 美元的价格再购买 2,000 个,所以这是一笔非常划算的交易。它有一个非常简单的用法,你只需要一个 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!");
?>

他们在这里有一个非常好的文档,所以你一定要看看。

于 2018-01-25T20:40:19.607 回答