PHP批量采集下载美女图片的实现代码
发布时间:2020-12-13 06:19:04 所属栏目:PHP教程 来源:网络整理
导读:设计思路 考虑到单纯的采集一个网页的图片,太麻烦,所以直接采集他的列表页,获取列表的url然后在一一采集,但是用php匹配列表页的url太麻烦,第一列表页有很多无效url这对我这个正则小菜鸟实在是个问题,看了一下列表页的结构,果断采用jquery获取url,jqu
设计思路考虑到单纯的采集一个网页的图片,太麻烦,所以直接采集他的列表页,获取列表的url然后在一一采集,但是用php匹配列表页的url太麻烦,第一列表页有很多无效url这对我这个正则小菜鸟实在是个问题,看了一下列表页的结构,果断采用jquery获取url,jquery的万能选择器又再次强大起来了。 jquery获取url,然后ajax传递url—>对应PHP文件,遍历url参数—->单页面采集保存图片jquery程序 代码如下: PHP采集程序 代码如下: // 抓起365图片 考虑到性能问题:在getimgs方法中所用的变量都是使用后便注销(unset)了,以便释放内存。设计到的几个知识点 判断是否是标准有效图片url error_reporting(E_ALL ^ E_NOTICE); set_time_limit(0);//设置PHP超时时间 /** * 得到当前时间 */ function getMicrotime() { list ($usec,$sec) = explode(" ",microtime()); return ((float) $usec + (float) $sec); } $stime = getMicrotime(); $callback = $_GET['callback']; $hrefs = $_GET['hrefs']; $urlarray = explode(',',$hrefs); //获取指定url的所有图片 function getimgs($url){ $dirname = basename($url,".php"); if(!file_exists($dirname)){ mkdir('365/'.$dirname.''); } clearstatcache(); $data = file_get_contents($url); preg_match_all("/(href|src)=(["|']?)([^ "'>]+.(jpg|png|PNG|JPG|gif))2/i",$data,$matches); //$matches[3] = array_unique($matches[3]); unset($data); $i=0; if(count($matches[3])>0){ foreach($matches[3] as $k=>$v){ //简单判断是否是标准url,而不是相对路径 if(substr($v,4)=='http'){ $ext = pathinfo($v,PATHINFO_EXTENSION);//图片扩展 if(!file_exists('365/'.$dirname.'/'.$k.'.'.$ext)){ file_put_contents('365/'.$dirname.'/'.$k.'.'.$ext,file_get_contents($v)); $i++; }else{ unset($v); } clearstatcache(); }else{ unset($v); } } unset($matches); return $i; } } foreach($urlarray as $k=>$v){ if($v!=''){ $j +=getimgs($v); } } $etime = getMicrotime(); echo "合计采集了".$j."张图片"; echo "用时".($etime-$stime)."秒"; if(substr($v,4)=='http')这个只是简单的判断一下匹配到的图片url是否是标准的url,因为采集的图片可能是相对路径的,这里我直接放弃这种图片的采集,当然你也可以把这种图片还原成标准图片路径,还有一个问题就是即使是标准url格式,这样的图片也未必可以采集,因为你不知道这个图片是否还有,也许这个图片url已经无效了,如果你想更严格的判断这个图片url是否真实有效可以推荐看我之前的《PHP判断远程url是否有效的几种方法》有三种方法可以验证是否是有效url。 获取图片格式 $ext = pathinfo($v,PATHINFO_EXTENSION);//图片扩展 这里使用了pathinfo的方法,总结有7种方法可以获取到文件的格式,推荐文章:《PHP判断图片格式的七种方法》 下载保存到本地 file_put_contents('365/'.$dirname.'/'.$k.'.'.$ext,file_get_contents($v)); file_put_contents() 函数把一个字符串写入文件中。 与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。 file_get_contents() 函数把整个文件读入一个字符串中。 因为服务器支持file_get_contents,如果服务器把这个函数禁用了,可以使用curl,这个工具要比file_get_contents更加强大,推荐学习《CURL的学习和应用(附多线程)》,可以使用curl的多线程下载存储,效果更牛逼 清除文件操作缓存clearstatcache() 函数清除文件状态缓存。clearstatcache() 函数会缓存某些函数的返回信息,以便提供更高的性能。但是有时候,比如在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被删除或修改的危险时,你需要清除文件状态缓存,以便获得正确的结果。要做到这一点,就需要使用 clearstatcache() 函数。官方手册: 程序执行时间计算 代码如下: /** * 得到当前时间 */ function getMicrotime() { 可以参考本博客文章;《获取php页面执行时间,数据库读写次数,函数调用次数等【THINKPHP】》 最后看一下效果; list ($usec,microtime()); return ((float) $usec + (float) $sec); } ![]() 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |