文档章节

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

o
 osc_4nmshwhm
发布于 2018/08/07 10:08
字数 820
阅读 5
收藏 0

精选30+云产品,助力企业轻松上云!>>>

<!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;
    }
    ?>

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

银河麒麟操作系统常用问题及解决方法

银河麒麟操作系统常用问题及解决方法 参考文章: (1)银河麒麟操作系统常用问题及解决方法 (2)https://www.cnblogs.com/kylinos/p/7687828.html 备忘一下。...

osc_h5q1h18n
15分钟前
13
0
大数据分析的步骤有哪些

  数据分析过程的主要活动包括识别信息需求,收集数据,分析数据,评估和提高数据分析的有效性。下面,中琛魔方将为大家详细介绍这四个步骤。   一,识别需求   信息需求是确保数据分析...

osc_tj0is418
16分钟前
14
0
linux怎么在history命令中前面显示日期

我们都对 history 命令很熟悉。它将终端上 bash 执行过的所有命令存储到 .bash_history 文件中,来帮助我们复查用户之前执行过的命令。 默认情况下 history 命令直接显示用户执行的命令而不会...

osc_rq7kb4yf
17分钟前
15
0
张钹院士:探索第三代人工智能,需要勇闯无人区的人才!

整理 | 夕颜 出品 | CSDN(ID:CSDNnews) 【导读】7 月 3-4 日,由 CSDN 主办的第三届 AI 开发者大会(AI ProCon 2020)在线上举行。本次大会有超万人报名参与,参与人群覆盖 50+ 领域、400...

osc_kvlhvh2u
18分钟前
7
0
十分钟快速搭建Python+Selenium自动化测试环境(含视频教程)

文章首发于微信公众号:爱码小哥 准备安装包: 一:安装python: 双击python-3.7.6.exe执行文件 2.点击下一步正在安装: 3.如图所示表示安装完成: 校验环境是否安装成功: 打开cmd命令行: ...

osc_knx03fpr
20分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部