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


Posted in PHP onAugust 02, 2019

本文实例讲述了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数据库表):

CREATE TABLE IF NOT EXISTS `t_url` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `url` varchar(100) NOT NULL,
 `pictype` tinyint(1) unsigned NOT NULL COMMENT '1.非比例缩略图2比例缩略图
 `flag` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0.禁用1.可用
 PRIMARY KEY (`id`)
) 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代码:

<?php
//------------------------------------------------------------
//从表t_url中提取url链接,存放到数组$data中
//--------------------------------------------------------------
mysql_connect("localhost","root","123");
mysql_select_db("test");
$sql = "select * from t_url";
//选用sql语句$sql2 = "select * from t_url where pictype = 1 and flag = 1";
$query = mysql_query($sql);
//------------------------------------------
//生成批处理文件
//------------------------------------------
$expire_time = 10;  //代表10天,文件过期时间,86400秒/天
$i = 0;
foreach($row = mysql_fetch_array($query)){
 $url_md5 = md5($row['url']);
 $file_folder = 'img/';
 $filename = $file_folder.$url_md5.'.'.'jpg';
 $newname = $url_md5.'.'.'jpg';
 if (!file_exists($filename) || (filemtime ($filename) + $expire_time * 86400 < time()) ) {
    $str .= "if not exist ".$newname." (iecapt.exe --url=".$value['url']." --out=".$newname.")\r\n";
    if(($i % 30) == 0 && $i > 0){   //每30条为一个批处理文件
       $title = "title capt".$i.".bat\r\n";
       $str = $title.$str;
       $file_bat = fopen("img_tmp/capt".$i.".bat","w");
       if(fwrite($file_bat,$str)){
        echo "批处理文件capt".$i."生成成功<br>";
        $str = "";
       }
    }
    $i = $i+1;
 }
}
?>

运行结果:

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

(图二)

四、执行批处理文件

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

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

(图三)

五、创建缩略图

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

ceate_image_img.php代码:

<?php
mysql_connect("localhost","root","123456");
mysql_select_db("test");
if(!isset($_GET['ID'])){
 $_GET['ID'] = 1;
}
if($_GET['ID']){
 $sql = "select * from t_url id =".$_GET['ID'];
 $query = mysql_query($sql);
 $row = mysql_fetch_array($query);
 echo "<span style='color:#CE0000;'>正在生成缩略图:</span>".$row['id']." ".$row['url']."<br><br>";
  $url = $row['url'];
  $url_md5 = md5($url);
  $pictype = $row['pictype'];
  $limit_time = 1;                         //创建 $limit_time日内创建的大图,天
  $thumbnails_folder = 'img_tmp/';             //保存临时大图的目录,必须以/结束
  $thumbnails_folder2 = 'img/';               //保存小图的目录,必须以/结束
  $output_format = 'jpg';
  $cached_filename = $thumbnails_folder.$url_md5.".".$output_format;
  $to_filename = $thumbnails_folder2 .$url_md5.'.'.$output_format;
    if((file_exists($cached_filename) || filemtime ($filename) + $limit_time*86400 > time())
     && !file_exists($to_filename)){
     if (filesize($cached_filename) > 1024){ //字节,不能是空白图片
       //创建缩略图
        include("image.class.php");
        $img = new Zubrag_image;
        // get parameters
        $img->image_type  = 2; // 1 = GIF, 2 = JPG, 3 = PNG
        $img->quality   = 80;
        $img->max_w    = 90;
        $img->max_h    = 67;
        $img->iscapt = ($pictype == 1) ? true : false; //此处用布尔型即可,数据库不可1.非比例缩略图2.按比例缩略
        if($img->GenerateThumbFile($cached_filename, $to_filename)){
         echo "<span style='color:#CE0000;'>成功创建缩略图:</span>".$row['id']." ".$row['url'];
        }else{
         echo "<span style='color:#0000CE;'>未能创建缩略图:</span>".$row['id']." ".$row['url'];
        }
      }
    }
 $sql = "select * from t_url id >".$_GET['ID']." and flag = 1 order by id asc limit 1";
 $query = mysql_query($sql);
 $row = mysql_fetch_array($query);
 echo "<br><span style='color:#0000CE;'>准备生成缩略图:</span>".$row['id']." ".$row['url']."<br><br>";
 if($row['id']){
  echo "<script>window.location.href='create_image_img.php?ID=".$row['id']."';</script>";
 }else{
  $_GET['ID'] = "";
 }
}
?>

image.class.php代码:

<?php
class Zubrag_image {
 var $iscapt = true;
 var $image_type = -1;
 var $quality = 100;
 var $max_w = 100;
 var $max_h = 100;
 function SaveImage($im, $filename) {
  $res = null;
  if(($this->image_type == 1) && !function_exists('imagegif')) $this->image_type = 3;
  switch ($this->image_type) {
   case 1:
    //if ($this->save_to_file) {
     $res = ImageGIF($im,$filename);
    //}
    //else {
    // header("Content-type: image/gif");
    // $res = ImageGIF($im);
    //}
    break;
   case 2:
     $res = ImageJPEG($im,$filename,$this->quality);
    break;
   case 3:
     $res = ImagePNG($im,$filename);
    break;
  }
  return $res;
 }
 function ImageCreateFromType($type,$filename) {
   $im = NULL;
   switch ($type) {
    case 1:
     $im = ImageCreateFromGif($filename);
     break;
    case 2:
     $im = ImageCreateFromJpeg($filename);
     break;
    case 3:
     $im = ImageCreateFromPNG($filename);
     break;
  }
  return $im;
 }
 function GenerateThumbFile($from_name, $to_name) {
  list($orig_x, $orig_y, $orig_img_type, $img_sizes) = GetImageSize($from_name);
  /*if ($this->cut_x > 0) $orig_x = min($this->cut_x, $orig_x);
  if ($this->cut_y > 0) $orig_y = min($this->cut_y, $orig_y);*/
    if ($this->iscapt && (($orig_y/$orig_x) > (90/67))) { //是截图,且高度过高
     $orig_y = $orig_x*(67/90);
    }
  $this->image_type = ($this->image_type != -1 ? $this->image_type : $orig_img_type);
  if ($orig_img_type < 1 or $orig_img_type > 3) die("Image type not supported");
  if ($this->image_type == 1) {
   $ni = imagecreate($this->max_w, $this->max_h);
  }
  else {
   $ni = imagecreatetruecolor($this->max_w,$this->max_h);
  }
  $white = imagecolorallocate($ni, 255, 255, 255);
  imagefilledrectangle( $ni, 0, 0, $this->max_w, $this->max_h, $white);
  $im = $this->ImageCreateFromType($orig_img_type,$from_name);
  imagepalettecopy($ni,$im);
  imagecopyresampled(
   $ni, $im,
   0, 0, 0, 0,
   $this->max_w, $this->max_h,
   $orig_x, $orig_y);
  if($this->SaveImage($ni, $to_name)){
     return true;
  }else{
     return false;
  }
 }
}
?>

六、总结

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

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP脚本的10个技巧(3)
Oct 09 PHP
PHP开发规范手册之PHP代码规范详解
Jan 13 PHP
PHP中uploaded_files函数使用方法详解
Mar 09 PHP
PHP中英混合字符串截取函数代码
Jul 17 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
Mar 26 PHP
PHP批量获取网页中所有固定种子链接的方法
Nov 18 PHP
PHP使用第三方即时获取物流动态实例详解
Apr 27 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
Jul 04 PHP
yii2 上传图片的示例代码
Nov 02 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
May 02 PHP
关于PHP求解三数之和问题详析
Nov 09 PHP
php抽象类和接口知识点整理总结
Aug 02 #PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 #PHP
php菜单/评论数据递归分级算法的实现方法
Aug 01 #PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 #PHP
php curl发送请求实例方法
Aug 01 #PHP
php layui实现前端多图上传实例
Jul 30 #PHP
安装docker和docker-compose实例详解
Jul 30 #PHP
You might like
自己前几天写的无限分类类
2007/02/14 PHP
php下获取http状态的实现代码
2014/05/09 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
AngularJs 利用百度地图API 定位当前位置 获取地址信息
2017/01/18 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
python实现电子词典
2020/04/23 Python
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
Python实现输出某区间范围内全部素数的方法
2018/05/02 Python
Python中的Numpy矩阵操作
2018/08/12 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
2019/06/13 Python
python生成器用法实例详解
2019/11/22 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
美国在线珠宝商店:SZUL
2017/02/11 全球购物
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
职业生涯规划怎么写
2013/12/29 职场文书
试用期员工考核制度
2014/01/22 职场文书
安全标准化汇报材料
2014/02/03 职场文书
骨干教师申报材料
2014/12/17 职场文书
2015年行风建设工作总结
2015/05/15 职场文书