网站截图

有什么方法可以用PHP截图一个网站,然后保存到一个文件?

346819 次浏览

不直接。像Selenium这样的软件有这样的特性,可以用PHP控制,但有其他依赖(比如在你想要截图的浏览器的计算机上运行基于java的服务器)

最后一次编辑: 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直接

自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系统上可用!

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

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

使用这个api的主要优点是,它允许你指定浏览器尺寸,以防你使用自适应css,所以我使用它来获得移动和平板电脑布局以及常规布局的渲染。

有以下语言的api客户端:

< p > PHP, Python, Ruby, Java, net c#, PerlBash (shell脚本看起来需要perl)

这完全取决于你想如何截屏。

你可以通过PHP,使用webservice来获取图像

grabz。它有一个webservice来做这件事,这里有一篇文章展示了一个使用该服务的简单示例。

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

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

你也可以在PHP中使用PhantomJS。

看看这个php脚本。看看这里https://github.com/microweber/screen

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

Cutycapt保存网页的大多数图像格式(jpg,png..)下载它从你的突触,它比wkhtmltopdf工作得更好

如果你不想使用任何第三方工具,我遇到了一个简单的解决方案,那就是使用谷歌页面洞察 api。

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

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

对于移动站点视图,在params中传递&strategy=mobile

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

< <强> < em >演示/ em > < / >强

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

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

URL参数

  • 宽度和高度:截图.php?url=google.com&w=1000&h=800

  • <李> < p >种植: screenshot.php ? url = google.com& w = 1000和h = 800, clipw = 800, cliph = 600 < / p > < /李>
  • 关闭缓存并加载fresh screesnhot:
    . screenshot.php ? url = google.com&缓存= 0 < / p > < /李>

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

你可以在这里看到教程:抓取一个网站截图使用PHP没有API

我最终使用@boksiora提出的microweber /屏幕进行设置 最初,当尝试这里提到的< em > < / em >链接时,我得到了:

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。当你看到截图时,你就完成了。有关更高级设置的讨论可以在这里< em > < / em >这里< em > < / em >中找到。

你可以使用剪贴画。

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

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

这些项目的最大问题是,它们基于旧的浏览器技术,在渲染许多网站时存在问题,特别是在过去几个月/几年里使用webfonts、flexbox、svg和其他各种添加到HTML5和CSS规范的网站。

我尝试了一些第三方服务,大多数都是基于PhantomJS的,这意味着它们的截图质量也很差。生成网站截图的最好的第三方服务是urlbox.io。这是一项付费服务,但也有7天的免费试用,无需承诺任何付费计划。

这里是文档的链接,下面是简单的步骤,让它在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" />

例如,这里是这个页面的全高截图:

 stackoverflow.com question powered by urlbox.io

你可以使用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如果没有。检查细节的文档。

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

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

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

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

  • ApiFlash(基于chrome)
  • EvoPDF(有html选项)
  • < a href = " https://grabz.it/html-to-pdf-image-api。aspx noreferrer“rel = > Grabzit < / >
  • ...

优点

  • 执行Javascript
  • 近乎完美渲染
  • 正确使用缓存选项时快速
  • 缩放由api处理
  • 精确计时,视口,…
  • 大多数时候,他们提供的是免费方案

缺点

  • 如果你打算经常使用它们,就不是免费的

选项2:使用众多可用库中的一个

优点

  • 大多数时候,转换是相当快的

缺点

  • 坏的呈现
  • 不执行javascript
  • 不支持最近的网页功能(FlexBox,高级选择器,网页字体,盒子大小,媒体查询,HTML5标签…)
  • 有时不容易安装
  • 缩放复杂

选项3:使用PhantomJs和包装器库

优点

  • 执行Javascript
  • 很快

缺点

  • 坏的呈现
  • PhantomJs已弃用,不再维护。
  • 不支持最近的网页功能(FlexBox,高级选择器,网页字体,盒子大小,媒体查询,HTML5标签…)
  • 缩放复杂
  • 不那么容易使它工作,如果有图像要加载…

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

  • Chrome Headless
  • < a href = " https://chromedevtools.github。io / devtools-protocol noreferrer“rel = > chrome-devtools-protocol < / >
  • 木偶师
  • ...

优点

  • 执行Javascript
  • 近乎完美渲染

缺点

  • 要得到想要的结果并不容易:
    • 页面加载时间
    • 代理集成
    • 自动滚动
    • ...
    • 李< / ul > < / >
    • 缩放复杂
    • 相当慢,甚至更慢,如果html包含外部链接

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

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

PPTRAAS >一个免费的工具来捕捉截图通过传递你的URL作为参数

它们提供了多种选择,只需点击URL即可。

  1. < p > 获取全页截图

    https://pptraas.com/screenshot?url={YOU URL HERE}

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

    https://pptraas.com/screenshot?url={YOU URL HERE}&size=400,400

  3. < p > 用户甚至可以将页面转换为pdf格式

    https://pptraas.com/pdf?url={YOU URL HERE}

    .

有一些方法可以在PHP中实现这一点,但实际上,最好将其委托给非基于PHP的API,您可以自己构建,也可以付费购买。许多人已经在答案中列出了截图api,你可以使用其中任何一个来实现这一点。我自己的截图API经过了非常好的测试,涵盖了大多数api没有涵盖的许多呈现情况,但对大多数人来说,老实说,这是多余的。

我的建议是使用Puppeteer构建自己的API,这是目前构建截图解决方案的规范解决方案。我的服务是建立在Puppeteer的基础上的,对于大多数基本的用例来说,它真的工作得很好。

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