【轻松下载】一键下载贴吧帖子内所有图片,保存到电脑

<!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