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数组
Oct 09 PHP
十天学会php之第八天
Oct 09 PHP
用PHP读取IMAP邮件
Oct 09 PHP
php录入页面中动态从数据库中提取数据的实现
Oct 09 PHP
真正的ZIP文件操作类(php)
Jul 21 PHP
php 分页原理详解
Aug 21 PHP
将文件夹压缩成zip文件的php代码
Dec 14 PHP
PHP系统命令函数使用分析
Jul 05 PHP
PHP实现货币换算的方法
Nov 29 PHP
PHP基于curl模拟post提交json数据示例
Jun 22 PHP
PHP正则表达式笔记与实例详解
May 09 PHP
在laravel5.2中实现点击用户头像更改头像的方法
Oct 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使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
php微信开发自定义菜单
2016/08/27 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
jQuery选择没有colspan属性的td的代码
2010/07/06 Javascript
JS中捕获console.log()输出的方法
2015/04/16 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
JS实现随机抽选获奖者
2019/11/07 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
python中列表和元组的区别
2017/12/18 Python
对python的文件内注释 help注释方法
2018/05/23 Python
Python数据可视化教程之Matplotlib实现各种图表实例
2019/01/13 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
生物化工专业个人自荐信
2013/09/26 职场文书
写好自荐信的技巧
2013/11/08 职场文书
我的中国梦演讲稿1000字
2014/08/19 职场文书
学生上课说话检讨书
2014/10/25 职场文书
会计电算化实训报告
2014/11/04 职场文书
logback如何自定义日志存储
2021/08/30 Java/Android