PHP批量采集下载美女图片的实现代码


Posted in PHP onJune 03, 2013

设计思路

考虑到单纯的采集一个网页的图片,太麻烦,所以直接采集他的列表页,获取列表的url然后在一一采集,但是用php匹配列表页的url太麻烦,第一列表页有很多无效url这对我这个正则小菜鸟实在是个问题,看了一下列表页的结构,果断采用jquery获取url,jquery的万能选择器又再次强大起来了。

jquery获取url,然后ajax传递url—>对应PHP文件,遍历url参数—->单页面采集保存图片

jquery程序

<script src="http://www.cztv.com/uibase/jquery.js"></script> 
<script > 
$(document).ready(function(){ 
var hrefs =''; 
$('.f_folder>a').each(function(i){ 
var href = $('.f_folder:eq('+i+')>a:eq(0)').attr('href'); 
if(href!='undefined'){ 
hrefs +=href+','; 
} 
}) 
$.getJSON("http://www.****.com/365/getimg.php?hrefs="+hrefs+"&callback=?", function(data){ 
//alert(data.info); 
}); 
}); 
</script>

这里把url拼接成‘,'分割的字符串传递url,使用getjson是为了跨域需要,关于getjson常见的几个问题可以参看<$.getjson遇到的几个问题>

PHP采集程序

<?php 
// 抓起365图片 
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,0,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)."秒";

考虑到性能问题:在getimgs方法中所用的变量都是使用后便注销(unset)了,以便释放内存。

设计到的几个知识点

判断是否是标准有效图片url
if(substr($v,0,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() { 
list ($usec, $sec) = explode(" ", microtime()); 
return ((float) $usec + (float) $sec); 
}

可以参考本博客文章;《获取php页面执行时间,数据库读写次数,函数调用次数等【THINKPHP】》

最后看一下效果;

PHP批量采集下载美女图片的实现代码

409秒采集了214张图片,大概2秒下载保存了一张图片,图片总大小约62M,这样看来:

一个小时60*60可以大约下载1800张美女图片。

PHP 相关文章推荐
在字符串指定位置插入一段字符串的php代码
Feb 16 PHP
php中根据某年第几天计算出日期年月日的代码
Feb 24 PHP
如何在PHP中使用正则表达式进行查找替换
Jun 13 PHP
使用PHP求两个文件的相对路径
Jun 20 PHP
2014过年倒计时示例
Jan 31 PHP
zf框架的zend_cache缓存使用方法(zend框架)
Mar 14 PHP
php自定义函数截取汉字长度
May 15 PHP
php中get_defined_constants函数用法实例分析
May 12 PHP
PHP实现的DES加密解密实例代码
Apr 06 PHP
php结合md5的加密解密算法实例
Sep 30 PHP
自制PHP框架之设计模式
May 07 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
Dec 05 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 #PHP
解析CI即CodeIgniter框架在Nginx下的重写规则
Jun 03 #PHP
深入php函数file_get_contents超时处理的方法详解
Jun 03 #PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
Jun 03 #PHP
PHP CLI模式下的多进程应用分析
Jun 03 #PHP
基于php-fpm 参数的深入理解
Jun 03 #PHP
php-cli简介(不会Shell语言一样用Shell)
Jun 03 #PHP
You might like
探讨方法的重写(覆载)详解
2013/06/08 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
简单谈谈php浮点数精确运算
2016/03/10 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
javascript:window.open弹出窗口的位置问题
2014/03/18 Javascript
javascript实时显示当天日期的方法
2015/05/20 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
实例解析jQuery中如何取消后续执行内容
2016/12/01 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
美国体育用品商店:Rally House(NCAA、NFL、MLB、NBA、NHL和MLS)
2018/01/03 全球购物
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
领导的自我鉴定
2013/12/28 职场文书
学校消防安全制度
2014/01/30 职场文书
优秀老师事迹材料
2014/02/05 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
租房协议书
2014/04/10 职场文书
升学宴演讲稿
2014/09/01 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书
认识实习感想
2015/08/10 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书