【问题标题】:Website screenshots网站截图
【发布时间】:2010-10-19 22:49:10
【问题描述】:

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

【问题讨论】:

  • 如果您喜欢直接解决方案,请查看Usersnap - 这是一项提供准确网站截图的优质服务。您只需在页面中添加一个小的 Javascript sn-p 即可使其正常工作。

标签: php screenshot


【解决方案1】:

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

【讨论】:

  • 现在有很多 PHP 库可供它使用。不完全是“PHP”库。涉及到一些js浏览器和代码。
【解决方案2】:

最后编辑:7 年后,我仍然对这个答案表示赞同,但我想 this one 现在更准确了。


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

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

更新 现在,有了新的 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 使用 php5-cli 和上述工具在 linux 上提供了一个简单/但有效的使用示例。

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

【讨论】:

  • 现在你提到 wkhtmltopdf KnpLabs 有一个包装器 github.com/KnpLabs/snappy
  • 几年前这些都是很棒的解决方案,但是它们所基于的浏览器技术并没有跟上最新的 HTML5/CSS 规范。如果您正在渲染一个使用 webfonts、svg、canvas、flexbox 等的网站,那么祝您获得准确的屏幕截图。如果您确实想要准确的屏幕截图,请查看我的 answer,它使用了urlbox
【解决方案3】:

从 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 系统!

【讨论】:

  • 不是真的只有 PHP 吗?
  • 这是使用 Internet Explorer 浏览器渲染内容。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

    有以下语言的 api 客户端:

    PHP, Python, Ruby, Java, .Net C#, PerlBash(shell 脚本看起来需要 perl)

    【讨论】:

      【解决方案6】:

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

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

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

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

      【讨论】:

        【解决方案7】:

        您可以使用简单的无头浏览器如 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

        【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

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

          只需要使用参数screenshot=true调用它的api。

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

          对于移动站点视图,请在参数中传递 &amp;strategy=mobile

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

          DEMO.

          【讨论】:

          • 这很酷,而且似乎也可以在不提供 api 密钥的情况下工作。但是返回的图像已损坏,您需要将所有“_”替换为“/”,将所有“-”替换为“+”,然后您可以将其添加为数据 uri
          • 这太棒了。我已经在gist.github.com/jaseclamp/d4ac6205db352e822ff6 编码了这个
          • 因此,作为参考,Google 的 Page Insight API 是第三方工具。
          • 屏幕截图的分辨率限制为 320x240,就像拇指一样
          • 不错的解决方案!我在这里遇到的唯一缺点是性能。使用此 API 获取屏幕截图平均需要 3-10 秒。我觉得有点长:(
          【解决方案10】:

          嗯,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

          【讨论】:

          【解决方案11】:

          我最终按照@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

          【讨论】:

            【解决方案12】:

            你可以使用 cutycapt 。

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

            【讨论】:

              【解决方案13】:

              有很多开源项目可以生成截图。例如 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

              【讨论】:

                【解决方案14】:

                您可以使用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 的文档。

                【讨论】:

                • 如果您正在寻找整页屏幕截图,此提供商需要专业版(170 美元/年)订阅。
                • Grabzit 的主要优点是它们在屏幕截图完成时使用回调。您不必不断轮询以查看是否已截取屏幕截图。
                【解决方案15】:

                我发现这是最好和最简单的工具: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!");
                ?>
                

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

                【讨论】:

                  【解决方案16】:

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

                  选项 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 的创始人。我尽力提供一个诚实而有用的答案。

                  【讨论】:

                    【解决方案17】:

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

                    PPTRAAS > 一个免费的工具,通过传递你的 URL 作为参数来截取屏幕截图

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

                    1. 获取整页截图

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

                    2. 获取特定尺寸的页面截图

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

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

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

                    【讨论】:

                    • 乔希,当我上传答案时,它曾经运行良好,我想我们不能依赖这个网址,请寻找另一个替代方案,因为他们现在可能已经停止了服务
                    【解决方案18】:

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

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

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2011-06-02
                      • 2023-01-14
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-12-28
                      相关资源
                      最近更新 更多