Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解

本文实例讲述了Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能,分享给大家供大家参考,具体如下:

最近在开发一个本地互联网应用的项目,为了增加用户体验,需要在搜索结果左侧显示如图一所示的某个网站的缩略图效果,在网上不停地百度谷歌了一上午后,发现大多数实现少量截图还是可以的,如果大批量的截图总会在中途出现很多问题,最终也没有发现十分满意的程序,干脆自己弄吧。

Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解

(图一)

下面是在windows环境下用php结合iecapt实现的网页截图并创建缩略图的步骤和代码:

一、准备

下载最新版IECapt

官方地址:http://iecapt.sourceforge.net/

在linux环境下,可以考虑用HTML2Image来实现

下载地址:http://www.guangmingsoft.net/htmlsnapshot/html2image.i386.tar.gz

其它的实现方式还有CutyCapt,另外,只要是windows环境,有IE浏览器(推荐使用IE7)即可,这个大部分机器都应该不是问题。

二、创建数据表(这一步非必须,根据实际情况选用)

因为要批量截图,数据十分的多,建立一个数据表来存放要截图的网站的url地址还是有必要的,如下所示(mysql数据库表):

  1. CREATE TABLE IF NOT EXISTS `t_url` (
  2. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  3. `url` varchar(100) NOT NULL,
  4. `pictype` tinyint(1) unsigned NOT NULL COMMENT '1.非比例缩略图2比例缩略图
  5. `flag` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0.禁用1.可用
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='url链接表' AUTO_INCREMENT=1 ;

三、创建批处理文件

1.首先把下载的iecapt压缩包解压,然后把iecapt.exe放到要生成截图的文件夹下(如:img_tmp)。

为了便于理解,在看下面代码前,先创建一个test.bat文件,鼠标右击编辑,写入一句话if not exist ay360cn.jpg (iecapt.exe --url=http://www.ay360.cn/ --out=ay360cn.jpg)保存,双击运行test.bat看看是否会在本目录下多出一个名叫ay360cn.jpg的文件,如果看到说明截图成功,这句话是截图的核心语句。

2.将需要截图的url链接导入url链接表t_url,然后执行如下php代码:

  1. <?php
  2. //------------------------------------------------------------
  3. //从表t_url中提取url链接,存放到数组$data中
  4. //--------------------------------------------------------------
  5. mysql_connect("localhost","root","123");
  6. mysql_select_db("test");
  7. $sql = "select * from t_url";
  8. //选用sql语句$sql2 = "select * from t_url where pictype = 1 and flag = 1";
  9. $query = mysql_query($sql);
  10. //------------------------------------------
  11. //生成批处理文件
  12. //------------------------------------------
  13. $expire_time = 10; //代表10天,文件过期时间,86400秒/天
  14. $i = 0;
  15. foreach($row = mysql_fetch_array($query)){
  16. $url_md5 = md5($row['url']);
  17. $file_folder = 'img/';
  18. $filename = $file_folder.$url_md5.'.'.'jpg';
  19. $newname = $url_md5.'.'.'jpg';
  20. if (!file_exists($filename) || (filemtime ($filename) + $expire_time * 86400 < time()) ) {
  21. $str .= "if not exist ".$newname." (iecapt.exe --url=".$value['url']." --out=".$newname.")\r\n";
  22. if(($i % 30) == 0 && $i > 0){ //每30条为一个批处理文件
  23. $title = "title capt".$i.".bat\r\n";
  24. $str = $title.$str;
  25. $file_bat = fopen("img_tmp/capt".$i.".bat","w");
  26. if(fwrite($file_bat,$str)){
  27. echo "批处理文件capt".$i."生成成功<br>";
  28. $str = "";
  29. }
  30. }
  31. $i = $i+1;
  32. }
  33. }
  34. ?>

运行结果:

Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解

(图二)

四、执行批处理文件

可以通过php程序循环执行 批处理文件,但在运行当中会出现很多问题,这里手动直接批量打开上面刚创建好的批处理文件,考虑到带宽和cpu,最多不要超过20个,截图的速度大约3-5秒/张效果如图三:

Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解

(图三)

五、创建缩略图

生成缩略图的文件是create_image_img.php,其中包含生成缩略图的主要的一个类文件是image.class.php,两个文件的代码如下:

ceate_image_img.php代码:

  1. <?php
  2. mysql_connect("localhost","root","123456");
  3. mysql_select_db("test");
  4. if(!isset($_GET['ID'])){
  5. $_GET['ID'] = 1;
  6. }
  7. if($_GET['ID']){
  8. $sql = "select * from t_url id =".$_GET['ID'];
  9. $query = mysql_query($sql);
  10. $row = mysql_fetch_array($query);
  11. echo "<span >正在生成缩略图:</span>".$row['id']."&nbsp;".$row['url']."<br><br>";
  12. $url = $row['url'];
  13. $url_md5 = md5($url);
  14. $pictype = $row['pictype'];
  15. $limit_time = 1; //创建 $limit_time日内创建的大图,天
  16. $thumbnails_folder = 'img_tmp/'; //保存临时大图的目录,必须以/结束
  17. $thumbnails_folder2 = 'img/'; //保存小图的目录,必须以/结束
  18. $output_format = 'jpg';
  19. $cached_filename = $thumbnails_folder.$url_md5.".".$output_format;
  20. $to_filename = $thumbnails_folder2 .$url_md5.'.'.$output_format;
  21. if((file_exists($cached_filename) || filemtime ($filename) + $limit_time*86400 > time())
  22. && !file_exists($to_filename)){
  23. if (filesize($cached_filename) > 1024){ //字节,不能是空白图片
  24. //创建缩略图
  25. include("image.class.php");
  26. $img = new Zubrag_image;
  27. // get parameters
  28. $img->image_type = 2; // 1 = GIF, 2 = JPG, 3 = PNG
  29. $img->quality = 80;
  30. $img->max_w = 90;
  31. $img->max_h = 67;
  32. $img->iscapt = ($pictype == 1) ? true : false; //此处用布尔型即可,数据库不可1.非比例缩略图2.按比例缩略
  33. if($img->GenerateThumbFile($cached_filename, $to_filename)){
  34. echo "<span >成功创建缩略图:</span>".$row['id']."&nbsp;".$row['url'];
  35. }else{
  36. echo "<span >未能创建缩略图:</span>".$row['id']."&nbsp;".$row['url'];
  37. }
  38. }
  39. }
  40. $sql = "select * from t_url id >".$_GET['ID']." and flag = 1 order by id asc limit 1";
  41. $query = mysql_query($sql);
  42. $row = mysql_fetch_array($query);
  43. echo "<br><span >准备生成缩略图:</span>".$row['id']."&nbsp;".$row['url']."<br><br>";
  44. if($row['id']){
  45. echo "<script>window.location.href='create_image_img.php?id']."';</script>";
  46. }else{
  47. $_GET['ID'] = "";
  48. }
  49. }
  50. ?>

image.class.php代码:

  1. <?php
  2. class Zubrag_image {
  3. var $iscapt = true;
  4. var $image_type = -1;
  5. var $quality = 100;
  6. var $max_w = 100;
  7. var $max_h = 100;
  8. function SaveImage($im, $filename) {
  9. $res = null;
  10. if(($this->image_type == 1) && !function_exists('imagegif')) $this->image_type = 3;
  11. switch ($this->image_type) {
  12. case 1:
  13. //if ($this->save_to_file) {
  14. $res = ImageGIF($im,$filename);
  15. //}
  16. //else {
  17. // header("Content-type: image/gif");
  18. // $res = ImageGIF($im);
  19. //}
  20. break;
  21. case 2:
  22. $res = ImageJPEG($im,$filename,$this->quality);
  23. break;
  24. case 3:
  25. $res = ImagePNG($im,$filename);
  26. break;
  27. }
  28. return $res;
  29. }
  30. function ImageCreateFromType($type,$filename) {
  31. $im = NULL;
  32. switch ($type) {
  33. case 1:
  34. $im = ImageCreateFromGif($filename);
  35. break;
  36. case 2:
  37. $im = ImageCreateFromJpeg($filename);
  38. break;
  39. case 3:
  40. $im = ImageCreateFromPNG($filename);
  41. break;
  42. }
  43. return $im;
  44. }
  45. function GenerateThumbFile($from_name, $to_name) {
  46. list($orig_x, $orig_y, $orig_img_type, $img_sizes) = GetImageSize($from_name);
  47. /*if ($this->cut_x > 0) $orig_x = min($this->cut_x, $orig_x);
  48. if ($this->cut_y > 0) $orig_y = min($this->cut_y, $orig_y);*/
  49. if ($this->iscapt && (($orig_y/$orig_x) > (90/67))) { //是截图,且高度过高
  50. $orig_y = $orig_x*(67/90);
  51. }
  52. $this->image_type = ($this->image_type != -1 ? $this->image_type : $orig_img_type);
  53. if ($orig_img_type < 1 or $orig_img_type > 3) die("Image type not supported");
  54. if ($this->image_type == 1) {
  55. $ni = imagecreate($this->max_w, $this->max_h);
  56. }
  57. else {
  58. $ni = imagecreatetruecolor($this->max_w,$this->max_h);
  59. }
  60. $white = imagecolorallocate($ni, 255, 255, 255);
  61. imagefilledrectangle( $ni, 0, 0, $this->max_w, $this->max_h, $white);
  62. $im = $this->ImageCreateFromType($orig_img_type,$from_name);
  63. imagepalettecopy($ni,$im);
  64. imagecopyresampled(
  65. $ni, $im,
  66. 0, 0, 0, 0,
  67. $this->max_w, $this->max_h,
  68. $orig_x, $orig_y);
  69. if($this->SaveImage($ni, $to_name)){
  70. return true;
  71. }else{
  72. return false;
  73. }
  74. }
  75. }
  76. ?>

六、总结

至此整个实现网页截图并创建缩略图的的步骤结束,其中执行批处理文件部分为了提高截图效率采用手动的方式,批量打开批处理文件,另外,链接数据库部分还可以用封装的数据库操作类来实现,代码会更加简洁。