• [PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索


    标题起的太大了,都是骗人的。最近使用PHP实现了简单的网盘搜索程序,并且关联了微信公众平台。用户可以通过公众号输入关键字,公众号会返回相应的网盘下载地址。就是这么一个简单的功能,类似很多的网盘搜索类网站,我这个采集和搜索程序都是PHP实现的,全文和分词搜索部分使用到了开源软件xunsearch,现在就来介绍一下实现过程。

    1. 获取一批网盘用户

    2. 根据网盘用户获取分享列表

    3. xunsearch实现全文检索和分词检索

    4. 微信公众平台接口开发

    功能展示:

    获取并采集百度网盘用户

    要想获取到分享列表,首先要先把百度的用户信息收集下来,现在我来介绍如何找到一大批百度的用户。先把浏览器的审查元素打开,查看HTTP的请求包,打开自己的百度网盘主页地址 https://pan.baidu.com/pcloud/home ,查看订阅的用户列表,观察请求。

    https://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=0&bdstoken=bc329b0677cad94231e973953a09b46f&channel=chunlei&clienttype=0&web=1&logid=MTQ5MzczNDgzMjgwMTAuOTE3Mzc4MDc4NDQ3NjU0OA== 这个请求就是获取订阅用户列表的接口。

    上面的参数含义分别是:query_uk (我自己的id编号,百度都是以uk来命名的)  ; limit (分页时每页显示的条数) ; start (分页起始编号) ; 剩下的参数全都并无任何卵用。

    精简后的接口地址是:https://pan.baidu.com/pcloud/friend/getfollowlist?query_uk={$uk}&limit=24&start={$start}

    处理分页的获取订阅者接口地址

    先暂时假设,我订阅了2400个用户,这个数量基本够用了。每页显示24个用户,那么就会分100页,则先看如何生成这个100个url。

    <?php
    /*
    * 获取订阅者
    */
    class UkSpider{
        private $pages;//分页数
        private $start=24;//每页个数
        public function __construct($pages=100){
            $this->pages=$pages;
        }
        /**
        * 生成接口的url
        */
        public function makeUrl($rootUk){
            $urls=array();
            for($i=0;$i<=$this->pages;$i++){
                $start=$this->start*$i;
                $url="http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk={$rootUk}&limit=24&start={$start}";
                $urls[]=$url;
            }
            return $urls;
        }
    }
    
    $ukSpider=new UkSpider();
    $urls=$ukSpider->makeUrl(3317165372);
    print_r($urls);

    获取的url接口列表结果:

    Array
    (
        [0] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=0
        [1] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=24
        [2] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=48
        [3] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=72
        [4] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=96
        [5] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=120

    使用CURL请求接口地址

    请求接口地址时,可以直接使用file_get_contents()函数,但是我这里使用的是PHP的CURL扩展函数,因为在获取分享文件列表时需要修改请求的header头信息。

    此接口返回的JSON信息结构如下

    {
        "errno": 0,
        "request_id": 3319309807,
        "total_count": 3,
        "follow_list": [
            {
                "type": -1,
                "follow_uname": "热心***联盟",
                "avatar_url": "http://himg.bdimg.com/sys/portrait/item/7fd8667f.jpg",
                "intro": "",
                "user_type": 0,
                "is_vip": 0,
                "follow_count": 0,
                "fans_count": 21677,
                "follow_time": 1493550371,
                "pubshare_count": 23467,
                "follow_uk": 3631952313,
                "album_count": 0
            },
            {
                "type": -1,
                "follow_uname": "绾*兮",
                "avatar_url": "http://himg.bdimg.com/sys/portrait/item/fa5ec198.jpg",
                "intro": "万里淘金,为你推荐精品全本小说,满满的资源福利!",
                "user_type": 6,
                "is_vip": 0,
                "follow_count": 10,
                "fans_count": 5463,
                "follow_time": 1493548024,
                "pubshare_count": 2448,
                "follow_uk": 1587328030,
                "album_count": 0
            },
            {
                "type": -1,
                "follow_uname": "自**检票",
                "avatar_url": "http://himg.bdimg.com/sys/portrait/item/8c5b2810.jpg",
                "intro": "没事看点小说。",
                "user_type": 0,
                "is_vip": 0,
                "follow_count": 299,
                "fans_count": 60771,
                "follow_time": 1493547941,
                "pubshare_count": 13404,
                "follow_uk": 1528087287,
                "album_count": 0
            }
        ]
    }

    如果要做一个综合性的网盘搜索网站,就可以把这些信息全都存入数据库,现在我只是做一个很简单的小说搜索网站,因此只留下了订阅盘主的uk编号。

    <?php
    /*
    * 获取订阅者
    */
    class UkSpider{
        private $pages;//分页数
        private $start=24;//每页个数
        public function __construct($pages=100){
            $this->pages=$pages;
        }
        /**
        * 生成接口的url
        */
        public function makeUrl($rootUk){
            $urls=array();
            for($i=0;$i<=$this->pages;$i++){
                $start=$this->start*$i;
                $url="https://pan.baidu.com/pcloud/friend/getfollowlist?query_uk={$rootUk}&limit=24&start={$start}";
                $urls[]=$url;
            }
            return $urls;
        }
        /**
        * 根据URL获取订阅用户id
        */
        public function getFollowsByUrl($url){
            $result=$this->sendRequest($url);
            $arr=json_decode($result,true);
            if(empty($arr)||!isset($arr['follow_list'])){
                return;
            }
            $ret=array();
            foreach($arr['follow_list'] as $fan){
                $ret[]=$fan['follow_uk'];
            }
            
            return $ret;
        }
        /**
        * 发送请求
        */
        public function sendRequest($url,$data = null,$header=null){
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            if (!empty($data)){
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            if (!empty($header)){
                curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
            }
    
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return $output;
        }
    }
    
    $ukSpider=new UkSpider();
    $urls=$ukSpider->makeUrl(3317165372);
    //循环分页url
    foreach($urls as $url){
        echo "loading:".$url."
    ";
        //随机睡眠7到11秒
        $second=rand(7,11);
        echo "sleep...{$second}s
    ";
        sleep($second);
        //发起请求
        $followList=$ukSpider->getFollowsByUrl($url);
        //如果已经没有数据了,要停掉请求
        if(empty($followList)){
            break;
        }
        print_r($followList);
    }

    循环请求上一步生成的urls,注意,此处要间隔一定秒数来发请求,否则会被直接封掉的,并且要判断如果没有数据了要停掉循环。此脚本一定要在命令行模式下运行,在浏览器上会直接超时死掉了。

    循环往复采集用户uk编号

    使用mysql数据库,建一张表例如uks,存储采集到的用户编号,表结构如下:

    CREATE TABLE `uks` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `uk` varchar(100) NOT NULL DEFAULT '',
      `get_follow` tinyint(4) NOT NULL DEFAULT '0',
      `get_share` tinyint(4) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_2` (`uk`),
      KEY `uk` (`uk`)
    )

    先存入一批,然后再根据这批继续找订阅盘主,不停的循环,里面的重要字段是:uk是唯一的 ; ’get_follow默认为0 当第二遍找它的订阅列表时,修改为1,防止重复采集。

    下一篇介绍根据uk获取分享列表,并且入库

    演示地址,关注微信公众号:网盘小说,或者扫描下面的二维码

  • 相关阅读:
    SpringBoot yml配置数据库密码特殊字符报错问题
    SpringBoot打jar包后无法访问resource下的文件
    js使用form提交工具类
    SpringBoot使用@ServerEndpoint无法@Autowired依赖注入问题解决
    java基于dfa实现敏感词过滤
    SpringBoot快速集成WebSocket实现群聊
    java生成序号前补0最简单的方法
    Mysql两个时间差计算方法
    python+selenium+webdriver环境搭建相关文档
    Java递归处理Tree树结构
  • 原文地址:https://www.cnblogs.com/taoshihan/p/6798719.html
Copyright © 2020-2023  润新知