搜尋
首頁後端開發php教程Win+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代码:  

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

运行结果:

(图二)

四、执行批处理文件

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


(图三)

五、创建缩略图

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

image.class.php代码:

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

六、总结

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

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
11個最佳PHP URL縮短腳本(免費和高級)11個最佳PHP URL縮短腳本(免費和高級)Mar 03, 2025 am 10:49 AM

長URL(通常用關鍵字和跟踪參數都混亂)可以阻止訪問者。 URL縮短腳本提供了解決方案,創建了簡潔的鏈接,非常適合社交媒體和其他平台。 這些腳本對於單個網站很有價值

在Laravel中使用Flash會話數據在Laravel中使用Flash會話數據Mar 12, 2025 pm 05:08 PM

Laravel使用其直觀的閃存方法簡化了處理臨時會話數據。這非常適合在您的應用程序中顯示簡短的消息,警報或通知。 默認情況下,數據僅針對後續請求: $請求 -

構建具有Laravel後端的React應用程序:第2部分,React構建具有Laravel後端的React應用程序:第2部分,ReactMar 04, 2025 am 09:33 AM

這是有關用Laravel後端構建React應用程序的系列的第二個也是最後一部分。在該系列的第一部分中,我們使用Laravel為基本的產品上市應用程序創建了一個RESTFUL API。在本教程中,我們將成為開發人員

簡化的HTTP響應在Laravel測試中模擬了簡化的HTTP響應在Laravel測試中模擬了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显著减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

php中的捲曲:如何在REST API中使用PHP捲曲擴展php中的捲曲:如何在REST API中使用PHP捲曲擴展Mar 14, 2025 am 11:42 AM

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

在Codecanyon上的12個最佳PHP聊天腳本在Codecanyon上的12個最佳PHP聊天腳本Mar 13, 2025 pm 12:08 PM

您是否想為客戶最緊迫的問題提供實時的即時解決方案? 實時聊天使您可以與客戶進行實時對話,並立即解決他們的問題。它允許您為您的自定義提供更快的服務

宣布 2025 年 PHP 形勢調查宣布 2025 年 PHP 形勢調查Mar 03, 2025 pm 04:20 PM

2025年的PHP景觀調查調查了當前的PHP發展趨勢。 它探討了框架用法,部署方法和挑戰,旨在為開發人員和企業提供見解。 該調查預計現代PHP Versio的增長

Laravel中的通知Laravel中的通知Mar 04, 2025 am 09:22 AM

在本文中,我們將在Laravel Web框架中探索通知系統。 Laravel中的通知系統使您可以通過不同渠道向用戶發送通知。今天,我們將討論您如何發送通知OV

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器