[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."\r\n";
    //隨機睡眠7到11秒
    $second=rand(7,11);
    echo "sleep...{$second}s\r\n";
    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獲取分享列表,並且入庫

演示地址,關注微信公眾號:網盤小說,或者掃描下面的二維碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM