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

2025-05-27 0 88

本文实例讲述了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

2

3

4

5

6

7
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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34
<?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代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50
<?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代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76
<?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;

}

}

}

?>

六、总结

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

原文链接:https://www.cnblogs.com/zhijiangch/p/5086184.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解 https://www.kuaiidc.com/71441.html

相关文章

发表评论
暂无评论