网站截图

时间:2009-04-16 19:25:18

标签: php screenshot

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

27 个答案:

答案 0 :(得分:270)

最后编辑:7年后我仍然得到了这个答案,但我猜this one现在更准确了。


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

否则,您可以使用wkhtmltopdf以pdf,jpg输出html页面,无论如何...... 接受CSS2.0,使用webkit(safari的包装器)来呈现页面..所以应该没问题。 您还必须在服务器上安装它..

UPDATE 现在,使用新的HTML5和JS功能,还可以使用JavaScript将页面呈现为画布对象。这是一个很好的图书馆:Html2Canvashere is an implementation由同一作者获得像G +这样的反馈。 将dom渲染到画布后,您可以通过ajax发送到服务器并将其另存为jpg。

编辑:您可以使用imagemagick工具将pdf转换为png。我的wkhtmltopdf版本不支持图像。例如。 convert html.pdf -append html.png

编辑This small shell script在linux上使用php5-cli和上面提到的工具提供了一个简单但有效的用法示例。

编辑:我现在注意到wkhtmltopdf团队正在开发另一个项目:wkhtmltoimage,直接为你提供jpg

答案 1 :(得分:87)

自PHP 5.2.2 以来,仅使用PHP捕获网站是可能的

  

imagegrabscreen - 捕获整个屏幕

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

imagegrabwindow - 使用Windows句柄(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系统!

答案 2 :(得分:53)

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

只需要使用params screenshot=true来调用它的api。

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

DEMO

答案 3 :(得分: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

答案 4 :(得分:17)

这应该对你有好处:

https://wkhtmltopdf.org/

请务必下载wkhtmltoimage发行版!

答案 5 :(得分:10)

是。你需要一些东西:

请参阅* nx上的khtmld(aemon)。 请参阅Url2Jpg for Windows,但由于它是dotNet app,您还应该Url2Bmp

两者都是可以从您的网络应用中获取屏幕截图的控制台工具。

还有提供它的网络服务。例如,请检查this

编辑:

link对您有用。

答案 6 :(得分:10)

它是在Python中,但是通过文档和代码,您可以确切地看到它是如何完成的。如果你可以运行python,那么它是一个现成的解决方案:

http://browsershots.org/

请注意,一台平台上的所有内容都可以运行,或者一台机器上运行其他平台的虚拟机可以运行。

免费,开源,滚动到页面底部,以获取文档,源代码和其他信息的链接。

答案 7 :(得分:5)

是的。如果你只需要URL的图像试试这个

<img src='http://zenithwebtechnologies.com.au/thumbnail.php?url=www.subway.com.au'>

将网址作为参数传递,您将获取有关详细信息的图片,请查看此链接http://zenithwebtechnologies.com.au/auto-thumbnail-generation-from-url.html

答案 8 :(得分:4)

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

答案 9 :(得分:4)

我总是使用microweber screen来捕获任何网页的屏幕截图。在这里,我们可以找到well written tutorial。这更容易,学习时间不应超过3分钟。

答案 10 :(得分:4)

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

__init__()

网址参数

  • 宽度和高度:screenshot.php?url = google.com&amp; w = 1000&amp; h = 800

  • 裁剪: screenshot.php URL = google.com&安培; W = 1000安培; H = 800&安培; clipw = 800安培; cliph = 600

  • 禁用缓存并加载新鲜的screesnhot:
    screenshot.php URL = google.com&安培;缓存= 0

  • 下载图片:screenshot.php?url = google.com&amp; download = true

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

答案 11 :(得分:3)

有许多开源项目可以生成屏幕截图。例如PhantomJS,webkit2png等

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

我尝试了一些第三方服务,大多数是基于PhantomJS,这意味着它们也会产生质量差的截图。用于生成网站屏幕截图的最佳第三方服务是urlbox.io。这是一项付费服务​​,虽然有一个免费的7天试用版来测试它而不承诺任何付费计划。

Here is a link to the documentation,以下是使用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-using-php%2F43652083%2343652083&full_page=true

full page screenshot of stackoverflow.com question powered by urlbox.io

答案 12 :(得分:3)

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

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

我在Linux上。因此,如果您想运行它,您可以根据您的环境调整我的步骤 以下是我在DOCUMENT_ROOT文件夹上的shell上执行的步骤:

$ 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。当您看到screenshot时,您就完成了。有关更多高级设置的讨论可用herehere

答案 13 :(得分:2)

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

答案 14 :(得分:1)

有很多选择,而且各有利弊。这是根据实现难度排序的选项列表。

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

专业人士

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

缺点

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

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

专业人士

  • 大多数情况下转换速度非常快

缺点

  • 效果不好
  • 不执行javascript
  • 不支持最新的网络功能(FlexBox,高级选择器,Webfonts,Box大小调整,媒体查询,HTML5标签...)
  • 有时候安装不太容易
  • 复杂的规模

选项3:使用PhantomJs以及包装器库

专业人士

  • 执行Javascript
  • 很快

缺点

  • 效果不好
  • PhantomJs已被弃用,不再维护。
  • 不支持最新的网络功能(FlexBox,高级选择器,Webfonts,Box大小调整,媒体查询,HTML5标签...)
  • 复杂的规模
  • 如果要加载图像,使它工作起来并不容易...

选项4:使用Chrome无头浏览器,并可能使用包装器库

专业人士

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

缺点

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

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

答案 15 :(得分:1)

webkit2html适用于Mac OS X和Linux,安装和使用非常简单。请参阅this tutorial

对于Windows,您可以使用具有类似功能的CutyCapt

答案 16 :(得分:1)

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

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

要实现它,您需要先获得app key and secretdownload(免费)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。查看details的文档。

答案 17 :(得分:1)

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

您可以通过PHP,使用网络服务为您获取图像

grabz.it有一个网络服务来做这件事,这里有一篇文章,展示了一个使用该服务的简单例子。

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

答案 18 :(得分:1)

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

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

以下语言有api客户端:

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

答案 19 :(得分:0)

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

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

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

答案 20 :(得分:0)

前几天,我使用Google API编写了一个快速而肮脏的应用程序。 肯定有改进的余地...

  • 它使用最新的Google API版本5。
  • 图片大小现在为500px宽
  • 支持桌面和移动视图
  • 保存到指定文件夹中的文件
  • 整合基本的缓存系统

在这里用live demo and code查找。

我之所以不会在这里发布代码,仅仅是因为我在不断完善它,并希望在有时间的时候将其转换为适当的类。

答案 21 :(得分:0)

您可以做两件事。

使用木偶

您可以使用PHP Puppeteer package来启动浏览器并截图。

使用API​​

有很多截图API。例如,您可以查看ScreenshotAPI.net。 (免责声明,我是该API的创建者)

答案 22 :(得分:0)

经过大量网上冲浪后,我发现了这一点。

PPTRAAS>一个免费工具,可通过将URL作为参数来捕获屏幕截图

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

  1. 获取完整的屏幕截图

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

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

    https://pptraas.com/screenshot?url= {您在此处输入URL}&size = 400,400

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

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

答案 23 :(得分:0)

我使用了page2images。它是基于cutycapt开发的,非常快速和稳定。如果您不想在性能和配置上花费太多时间,则应该使用它。如果你去他们的网站,你可以找到更多细节和PHP代码示例。

答案 24 :(得分:-1)

我发现这是最好,最简单的工具:ScreenShotMachine。这是一项付费服务​​,但你可以获得100个免费截图,你可以购买另外2000美元(约合)20美元,所以这是一个非常好的交易。它有一个非常简单的用法,你只需使用一个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!");
?>

他们有很好的文档here,所以你一定要看看。

答案 25 :(得分:-1)

你可以使用cutycapt。

kwhtml已弃用并显示旧浏览器页面。

答案 26 :(得分:-1)

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