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 相关文章推荐
应用开发中涉及到的css和php笔记分享
Aug 02 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
Jan 10 PHP
利用curl 多线程 模拟 并发的详解
Jun 14 PHP
浅析PHP的ASCII码转换类
Jul 05 PHP
使用PHP生成二维码的方法汇总
Jul 22 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
PHP利用二叉堆实现TopK-算法的方法详解
Apr 24 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 PHP
php实现多站点共用session实现单点登录的方法详解
Sep 18 PHP
laravel高级的Join语法详解以及使用Join多个条件
Oct 16 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
Apr 14 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
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
php foreach 使用&amp;(与运算符)引用赋值要注意的问题
2010/02/16 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
jQuery div层的放大与缩小简单实现代码
2013/03/28 Javascript
一个通过script自定义属性传递配置参数的方法
2014/09/15 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
python复制文件的方法实例详解
2015/05/22 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
Python合并多个Excel数据的方法
2018/07/16 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
关于Pytorch MaxUnpool2d中size操作方式
2020/01/03 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
2020/10/28 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
Reformation官网:美国女装品牌
2018/09/14 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
毕业生大学生活自我总结
2014/01/31 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
介绍信怎么写
2015/05/05 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
靠谱准确的求职信
2019/04/02 职场文书