php批量下载图片
某论坛上有个爆照帖,帖子都顶到一千多楼了。为了满足窥私欲,故需要设计一批量下载指定用户名图的程序。
之前的想法是直接用js实现,查了下说是用fso可以实现,其实从来没用过,看了下应该是对文件的操作,我估计可能不行。用js可以提取出下载的url,然后再在服务端进行下载。而提取url可以采取ajax轮询的操作,对n页进行ajax轮询,返回网页源码,新建一个div标签,将源码作为div标签的innerHTML内容插入,接下去就是dom的操作了~
服务端图片下载php代码:
1 <?php 2 function downloadFile($url, $savePath, $name = ‘‘) 3 { 4 if ($name == ‘‘) 5 { 6 $header = get_headers($url, 1); 7 // 如果链接进行过跳转则匹配 location 之后的链接中的文件名 8 if (isset($header[‘Location‘])) { 9 $name = basename(str_replace(strstr($header[‘Content-Type‘][1], ‘?‘), ‘‘, $header[‘Location‘])); 10 // 如果没有找到文件名则自动以当前时间为名称 11 $name = ($name == ‘‘) ? time() . str_replace(‘/‘, ‘‘, strstr($header[‘Content-Type‘][1], ‘/‘)) : $name; 12 } else { 13 $name = basename(str_replace(strstr($header[‘Content-Type‘], ‘?‘), ‘‘, $url)); 14 } 15 } 16 return file_put_contents($savePath .‘/‘. $name, file_get_contents($url)); 17 } 18 19 //保存图片路径 20 $savePath = dirname(__FILE__)."\images"; 21 downloadFile($url, $savePath); 22 // downloadFile($_POST[‘content‘], $savePath); 23 // $a = dirname(__FILE__); 24 // echo $a; 25 ?>
而客户端因为要进行ajax操作,所以写个同域的用户脚本就显得方便多了。对每页进行ajax操作后,回调函数中将回调的源码插入div中,然后对div进行dom操作,对用户名进行判断,如果符合,则对该层的img图片进行操作,提取url,post给后台,后台就可以下载了。详见注释
客户端js代码:
1 // ==UserScript== 2 // @name downloadpic 3 // @namespace http://www.cnblogs.com/bigbigsunrise 4 // @description 批量下载指定用户图片 5 // @include * 6 // @require http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js 7 // @grant GM_getValue 8 // @grant GM_setValue 9 // @grant GM_listValues 10 // @grant GM_deleteValue 11 // @author bigbigsunrise 12 // ==/UserScript== 13 14 $.noConflict(); 15 jQuery(document).ready(function($){ 16 // 跟帖的页码 17 var firstindex = 1; 18 var lastindex = 100; 19 // url的前缀,自己定义 20 var preurl = ‘...‘; 21 for(var i = firstindex; i <= lastindex; i++) { 22 jQuery.ajax ({ 23 type: ‘GET‘, 24 url: preurl + i, 25 dataType: ‘html‘, 26 async: true, // 异步 27 success: function (msg) { 28 var a = document.createElement(‘div‘); 29 // 插入dom树,可以进行dom操作 30 a.innerHTML = msg; 31 // 以下的JQ操作其实可以大幅度优化,因为没有时间限制,所以暂时不优化了 32 var b = $(a).find(‘.pi‘).children(‘.authi‘).children(‘.xw1‘); 33 for(var i = 0; i < b.size(); i++) { 34 // 用户名的判断,自己定义 35 if(b.eq(i).html() === ‘username‘) { 36 var c = b.eq(i).parent().parent().parent().parent().find(‘.t_fsz‘).find(‘img‘); 37 for(var j = 0; j < c.size(); j++) { 38 // 获取url 39 var src = c.eq(j).attr(‘file‘); 40 if(!src) continue; 41 if(src.charAt(0) === ‘h‘) 42 download(src); 43 else 44 // 自己定义 45 download(‘http://.../‘ + src); 46 } 47 } 48 } 49 } 50 }); 51 } 52 }); 53 54 function download(src) { 55 $.ajax({ 56 type: ‘POST‘, 57 url: ‘http://127.0.0.1/download/index.php‘, 58 // dataType: ‘‘, 59 async: false, 60 // post的内容 61 data: {content:src}, 62 success: function(msg) { 63 // alert(msg); 64 } 65 }); 66 }
这里说明下,js代码的第二个ajax其实是跨域了,控制台报错了不知道为什么还能继续执行。另外,如果知道了要下载的url,可以直接在后台定义数组,而邮件的发送则不能直接后台for循环操作,此处mark。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。