PHP+Ajax远程图片抓取器下载的例子
先看效果
实现原理
发送请求 :将输入的目标网址及保存路径名称采用AJAX异步的方式发送到image.info.php文件,该文件中包含有一个ImageCatch类,注意:因为有一个是指定目标图片抓取,一个是只要指定一个网址,如http://www.111cn.net形式,所以还要有一个参数用来判断是指定目标抓取还是指定网站抓取。
接收请求 :接收发送过来的两个参数,目标网址及保存路径,实例化ImageCatch类,将地址及保存路径传进去,用file_get_contents函数将目标地址的内容读取赋值给一个变量$content。
先说指定图片抓取的实现 :指定图片抓取的方法实现比较简单,直接用file_get_contents函数将图片读取到,再用file_put_contents写入到一个文件保存起来就可以了。
指定网址抓取图片的实现
方法跟指定图片地址抓取就有点不一样了,因为采用的是jquery+ajax无刷新模式抓取,所以,请求要一次一次发,先说第一次发什么请求,很显然,第一次发的请求内容是获取目标网址的所有图片地址及图片总数,那要怎样获取目标网址的所有图片地址呢?思路跟上面的一样,但方法不同;
第一步:用file_get_contents函数读取目标网址赋值给一个content变量。
第二步:用正则匹配所有img标签里的src属性,并保存在一个数组,这样网页的图片地址就已经拿到了
第三步:用正则匹配所有样式表文件link标签的href属性,并保存在一个数组$arr1
第四步:还是用file_get_contents函数读取获取的样式表文件,再用正则去匹配到css样式里的url背景图片地址,并保存在一个数组$arr2,这样css样式的图片又拿到了
第五步:将$arr1和$arr2用array_merge函数进行合并成$arr,再用一个数组$arr3(‘total’=>count($arr))得出图片总数并追加到数组$arr里面去,这样图片地址和总数都拿到了
第六步:用json_encode编译一个返回json数据 第七步:接收返回回来的json数据,将数据都存入一个数组,判断是否数组为空,不为空,则用函数递归的方法调用一个函数,每调用一次,在返回结果后就将该数组的第一个元素去掉,再判断数组是否为空,不为空,则继续发送抓取请求,直到数组为空,全部图片就已经都抓取完毕。
好了现在看例子
index.php
代码如下 | 复制代码 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>PHP远程图片抓取</title> <style> body { margin:0; padding:0; } #content { width:90%; height:auto; margin:0 auto; margin-top:20px; font-size:12px; color:#333; } #content .h1 { width:100%; line-height:30px; text-align:left; } #content .h2 { width:100%; line-height:30px; text-align:left; } #content .Schedule { width:auto; height:12px; margin:15px 0px; display:none; background:url() } #content ul { width:100%; height:auto; margin-top:10px; } #content ul li { height:24px; line-height:24px;} #content font { color:#f00; } </style> <script type="text/javascript" src="js/jquery.js"></script> <script> $(document).ready(function() { var TargetUrl; var Save; function error(info) { $('#content .h2 font').text(info); } function statusInfo(info) { $('#content ul').append('<li>'+info+'</li>'); } //禁用按钮 function start_d() { $('#Single,#more').attr('disabled','disabled'); } //解放按钮 function start_s() { $('#Single,#more').removeProp('disabled'); } //进度跳转 function href() { location.href='#bottom'; } //单个图片抓取 $('#content .h1 #Single').click(function() { TargetUrl=$('#content .h2 .TargetUrl').val(); Save=$('#content .h2 .Save').val(); if (TargetUrl=='') { error(' * 请填写目标网址'); return; } if (Save=='') { error(' * 请填写保存目录'); return; } var zurl=new Array(TargetUrl); start_d(); Crawl(zurl,Save); }); function Crawl(zurl,Save) { start_d(); $('#content .Schedule').show(); if (zurl.length>0) { var curl=zurl[0]; $.ajax({ url:'image.info.php?Single=Single', dataType:'json', type:'POST', data:'TargetUrl='+curl+'&Save='+Save, success: function(data) { if (data.status=='ok') { statusInfo('远程图片 <font>'+curl+'</font> 抓取成功 已保存在 <font>'+data.FileSave+'</font> 文件大小:<font>'+data.FileSize+'</font>'); zurl.shift(); //删除第一个数组元素并返回 Crawl(zurl,Save); //使用函数递归 href(); }else { zurl.shift(); //删除第一个数组元素并返回 Crawl(zurl,Save); //使用函数递归 statusInfo(data.status); //显示失败信息 $('#content .Schedule').hide(); //隐藏LOADING图片 start_s(); //按钮启用 href(); } } }); }else { $('#content .Schedule').hide(); statusInfo('图片抓取完毕'); start_s(); href(); } } //多个图片抓取 $('#content .h1 #more').click(function() { TargetUrl=$('#content .h2 .TargetUrl').val(); Save=$('#content .h2 .Save').val(); if (TargetUrl=='') { error(' * 请填写目标网址'); return; } var str=/^(https?://)?([da-z.-]+).([a-z.]{2,6})([/w .-]*)*/?$/; if (!str.test(TargetUrl)) { error(' * 目标网址不正确'); return; } if (Save=='') { error(' * 请填写保存目录'); return; } start_d(); $('#content .Schedule').show(); $.ajax({ url:'image.info.php?more=more', dataType:'json', type:'POST', data:'TargetUrl='+TargetUrl+'&Save='+Save, success: function(data) { if (data[0]!='no') { statusInfo('在目标网址 <font>'+TargetUrl+'</font> 找到 <font>'+data['total']+'</font> 张图片,现正在进行抓取....'); var zurl=new Array(); for (i=0; i<data['total']; i++) { zurl.push(data[i]); } Crawl(zurl,Save); }else { statusInfo("未抓取找到任何图片"); $('#content .Schedule').hide(); start_s(); } } }); }); $('#clear').click(function() { $('#content ul li').remove(); }); }); </script> </head> <body> <div id="content"> <h1>PHP远程图片抓取程序</h1> <div class="h1"> 指定图片抓取:<input type="button" value=" 开始抓取 " id="Single" /> <font>目标网址如:http://www.111cn.Net/123.jpg</font> 指定网址抓取:<input type="button" value=" 开始抓取 " id="more" /> <font>目标网址如:http://www.111cn.Net</font> <input type="button" value=" 清空状态信息 " id="clear" /> </div> <div class="Schedule"><font>正在抓取,请稍后...</font> <img src="loading.gif" border="0" /></div> <div class="h2">目标网址:<input type="text" class="TargetUrl" size="40" /> 保存地址:<input type="text" class="Save" /><font></font></div> <ul> </ul> <a name="bottom"></a> </div> </body> </html> |
images.info.php
代码如下 | 复制代码 |
<?php |
本例子不是读取Excel或生成新的Excel,而是读取现有的Excel文件,然后修改Excel中的数据,就像修改mysql中数据一样的哦。
代码如下 | 复制代码 |
//模板存放目录 $dir = $DOCUMENT_ROOT.'/backoffice/admin/oemcheck/'; $templateName = '1.xlsx'; $outputFileName = '模板.xlsx'; $txt='test'; //实例化Excel读取类 $PHPReader = new PHPExcel_Reader_Excel2007(); if(!$PHPReader->canRead($dir.$templateName)){ $PHPReader = new PHPExcel_Reader_Excel5(); if(!$PHPReader->canRead($dir.$templateName)){ echo '无法识别的Excel文件!'; return false; } } //读取Excel $PHPExcel = $PHPReader->load($dir.$templateName); //读取工作表1 $currentSheet = $PHPExcel->getSheet(0); $currentSheet->setCellValue('B13',iconv('gbk','utf-8',$txt));//表头赋值// //实例化Excel写入类 $PHPWriter = new PHPExcel_Writer_Excel2007($PHPExcel); ob_start(); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header('Content-Disposition:attachment;filename="' .$outputFileName. '"');//输出模板名称 header("Content-Transfer-Encoding: binary"); header("Last-Modified:".gmdate("D, d M Y H:i:s")." GMT"); header('Pragma: public'); header('Expires: 30'); header('Cache-Control: public'); $PHPWriter->save('php://output'); |
在php中要生成迅雷、快车、QQ旋风下载链接我们会使用到的加密方式有base64_encode与base64_decode来生成,下面看两个例子,希望对你会带来帮助。
在一些资源下载共享站点中,我们经常遇到需要在下载页中添加各种下载工具链接的情况。传统的利用各下载工具官方提供的脚本(.js)生成链接的方式,其弊端已日渐突出,如加载速度慢、客户端兼容性问题等。
本文将介绍如何通过 PHP 函数处理,轻松生成制作各种第三方下载工具的链接数据,并直接输出到前台上。
该功能所用到的 PHP 函数:
1. base64_encode: 用于以 base64 方式加密字符串;
2. base64_decode: 用于解密以 base64 方式加密的字符串。
例子1
以原始下载地址生成第三方工具下载链接 PHP 代码:
代码如下 | 复制代码 |
$url = 'http://www.example.com/document.zip'; |
从第三方工具下载链接还原成原始链接 PHP 代码:
代码如下 | 复制代码 |
$url_old = ''; |
例子2
代码如下 | 复制代码 |
<?php |
生成效果如下
碰到页面程序执行超时时会提醒Fatal error: Maximum execution time of 300 seconds exceeded 是因为程序执行时间超过了最大允许执行时间,解决办法我总结了好几个大家选择适合自己的吧。对于函数我们可以常用下面方法,直接给函数设置超时时间。
代码如下 | 复制代码 |
declare(ticks = 1); function a(){ sleep(10); echo "a finishi "; } function b(){ echo "Stop "; } function c(){ usleep(100000); } function sig(){ throw new Exception; } try{ pcntl_alarm(1); pcntl_signal(SIGALRM, "sig"); a(); pcntl_alarm(0); }catch(Exception $e){ echo "timeout "; } b(); a(); b(); |
来操作
对于文件或程序代码可使用set_time_limit只是设置你的PHP程序的超时时间
解决方法:
1. 修改php.ini文件:
代码如下 | 复制代码 |
max_execution_time = 30 ; // Maximum execution time of each script, in seconds |
原值30秒,你可以改大点。
改完后记得重启php。该方法改了后对所有程序生效。
2. 修改你的程序,在你需要耗时超过默认值(30秒)的脚本中,加入代码:
代码如下 | 复制代码 |
set_time_limit(300); // 最大执行时间这里设置300秒 |
设置成0表示不限时。
php生成word文档比excel感觉要方便多了,他只要设置一下头部信息我们就可以直接使用fopen来实现读取操作,下面看几个例子。
php直接用fopen生成的核心代码是
代码如下 | 复制代码 |
<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">'.你的放的数据.'</html> |
例子
代码如下 | 复制代码 |
function word($data,$fileName=''){ |
示例如下:
代码如下 | 复制代码 |
<?php |
为了方便使用我们把它整理成一个类文件
代码如下 | 复制代码 |
<?php function start() } function save($path) print "</html>"; ob_end_clean(); $this->wirtefile ($path,$data); function wirtefile ($fn,$data) $fp=fopen($fn,"wb"); } ?> |
使用方法超级简单
代码如下 | 复制代码 |
$word->start(); |
查询mysql数据生成word也是非常的简单我们只要连接数据库,然后把数据库的内容存放在类的$word字段中,然后再利用$word->start();生成即可。
相关文章
使用PHP+JavaScript将HTML页面转换为图片的实例分享
这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 今天小编在这里就来给各位Photoshop的这一款软件的使用者们来说说把古装美女图片转为细腻的工笔画效果的制作教程,各位想知道方法的使用者们,那么下面就快来跟着小编一...2016-09-14
- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
- 安装curl扩展支持https是非常的重要现在许多的网站都使用了https了,下面我们来看一篇关于PHP安装curl扩展支持https例子吧。 问题: 线上运行的lamp服务器,默认yu...2016-11-25
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮...2013-10-13- 下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
- Photoshop的这一款软件小编相信很多的人都已经是使用过了吧,那么今天小编在这里就给大家带来了用Photoshop软件制作枪战电影海报的教程,想知道制作步骤的玩家们,那么下面...2016-09-14
- 这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
- 图片剪裁是常用的方法,那么如何通过4坐标剪裁图片,本文就详细的来介绍一下,感兴趣的小伙伴们可以参考一下...2021-06-04
- 共享一段使用PHP下载CSS文件中的图片的代码 复制代码 代码如下: <?php //note 设置PHP超时时间 set_time_limit(0); //note 取得样式文件内容 $styleFileContent = file_get_contents('images/style.css'); //not...2013-10-04
- PHP代码如下:复制代码 代码如下:if (isset($_FILES["Filedata"]) || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] != 0) { $upload_file = $_FILES['Filedata']; $fil...2013-10-04
- 这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
C#中图片旋转和翻转(RotateFlipType)用法分析
这篇文章主要介绍了C#中图片旋转和翻转(RotateFlipType)用法,实例分析了C#图片旋转及翻转Image.RotateFlip方法属性的常用设置技巧,需要的朋友可以参考下...2020-06-25- ps软件是现在很多人比较喜欢的,有着非常不错的使用效果,这次文章就给大家介绍下ps怎么制作图片阴影效果,还不知道制作方法的赶紧来看看。 ps图片阴影效果怎么做方法/...2017-07-06
- 这篇文章主要介绍了OpenCV如何去除图片中的阴影的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-29
- 本文主要介绍用C#实现图片转换成字节流,字节流转换成图片,并根据图片路径返回图片的字节流,有需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了JavaScript 如何禁止用户保存图片,帮助大家完成需求,更好的理解和使用JavaScript,感兴趣的朋友可以了解下...2020-11-19
- 我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25