<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>轻松下载</title> <link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css"> </head> <body> <form method="post"> <div class="form-group"> <label for="exampleInputEmail1">输入贴吧帖子的url:</label> <input type="url" name="url" class="form-control" id="exampleInputEmail1" placeholder="https?://tieba.baidu.com/p/**********"> </div> <button type="submit" class="btn btn-primary btn-block">Submit</button> </form> </body> </html> <?php if(!isset($_POST['url'])){ exit(); } $url = $_POST['url']; set_time_limit(0); //匹配img url $imgPreg = '/src\=\"(http.+?)\"/'; //判断是否为合格的帖子链接 if(!preg_match('/^https?\:\/\/tieba\.baidu\.com\/p\/\d{9,11}/',$url,$tbUrl)){ echo 'URL错误!示例:"http://tieba.baidu.com/p/4407589179"'; exit(); } $url = $tbUrl[0]; //判断是http还是htpps的连接采取相应的正则 if(preg_match('/^http\:\/\//', $url)){ //匹配出回复的内容 $preg = '/class\=\"d_post_content\s+j_d_post_content\s+clearfix\"\>\s+(.+?)\<\/div\>\<br\>/'; }else{ $preg = '/class\=\"d_post_content\s+j_d_post_content\s+\"\>\s+(.+?)\<\/div\>\<br\>/'; } //得到源码 $content = _request($url); //如果返回的源码为空 if(!$content){ echo 'URL返回NULL,请检查!'; exit(); } echo '<p style="color:red;">--------------------URL:"'.$url.'"打开成功--------------------</p>'; //刷新缓冲,将数据发送到浏览器 ob_flush(); flush(); //页数默认为1 $pageCount = 1; //得到总页数 if(preg_match('/\?pn\=(\d+)\"\>尾页\<\/a\>/',$content ,$page)){ $pageCount = $page[1]; } echo '<p style="color:red;">--------------------帖子共有'.$pageCount.'页--------------------</p>'; echo '<p style="color:red;">--------------------正在读取帖子内所有图片--------------------</p>'; //刷新缓冲,将数据发送到浏览器 ob_flush(); flush(); //图片链接数组 $imgData= []; //当前页 $pageNow = 1; do{ if($pageNow>1){ $nowUrl = $url.'?pn='.$pageNow; $content = _request($nowUrl); } //当前页数自增 $pageNow++; //匹配回复 preg_match_all($preg, $content, $replyData); $pageImgCount = 0; //遍历回复 foreach ($replyData[1] as $value) { //过滤回复,获取jpg url数组 if(preg_match_all($imgPreg, $value,$data)){ foreach ($data[1] as $value) { //过滤掉表情 if(substr_count($value,'static')|substr_count($value,'image_emoticon')){ continue; } $imgData[] = $value; $pageImgCount++; } } } echo '<p style="font-size:12px;">第'.($pageNow-1).'页过滤完毕,读取图片'.$pageImgCount.'张,亲稍等···</p>'; ob_flush(); flush(); /* //延迟加载 sleep(500);*/ }while($pageNow<=$pageCount); //去重 $imgData = array_unique($imgData); echo '<p style="color:red;">--------------------读取完毕,有效图片:'.count($imgData).'张--------------------</p>'; echo '<p style="color:red;">--------------------开始下载图片,请勿关闭浏览器--------------------</p>'; ob_flush(); flush(); echo '<span style="font-size:12px;">当前下载</span>'; //存储到本地的图片数量 $imgCount = 0; foreach ($imgData as $value) { if(jpgChangeLocal($value)){ $imgCount++; echo '<span style="font-size:12px;">+</span>'; ob_flush(); flush(); } } echo '<p style="color:red;">--------------------程序结束,总计下载图片'.$imgCount.'张--------------------</p>'; echo '<p style="color:red;">--------------------文件路径c:\chenglin_image--------------------</p>'; //抓取(支持get/post) function _request($curl,$https=true,$method='GET',$data=null){ //1.创建一个新cURL资源 $ch = curl_init(); //2.设置URL和相应的选项 //要访问的网站 curl_setopt($ch, CURLOPT_URL, $curl); //启用时会将头文件的信息作为数据流输出。 curl_setopt($ch, CURLOPT_HEADER, false); //将curl_exec()获取的信息以字符串返回,而不是直接输出。 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if($https){ //FALSE 禁止 cURL 验证对等证书(peer's certificate)。 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //可以省略不写,默认为2 /* curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //验证主机 */ } if($method == 'POST'){ //发送 POST 请求 curl_setopt($ch, CURLOPT_POST, true); //全部数据使用HTTP协议中的 "POST" 操作来发送。 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } //3.抓取URL并把它传递给浏览器 $content = curl_exec($ch); if ($content === false) { return "网络请求出错: " . curl_error($ch); exit(); } //4.关闭cURL资源,并且释放系统资源 curl_close($ch); return $content; } //网络图片转换本地图片 function jpgChangeLocal($pic){ //获取文件 $file = _request($pic); $end = rand(1000,9999).'_'.time().'.jpg'; $dir_path = 'd:/image'; if(!is_dir($dir_path)){ mkdir($dir_path); } $filename = $dir_path.'/'.$end; //打开写入流 $resource = fopen($filename, 'a'); //写入 fwrite($resource, $file); //关闭资源 fclose($resource); return '@'.dirname(__FILE__).'/'.$filename; } ?>
【轻松下载】一键下载贴吧帖子内所有图片,保存到电脑
猜你喜欢
转载自www.cnblogs.com/cl94/p/9435361.html
今日推荐
周排行