[PHP] 網盤搜索引擎-採集爬取百度網盤分享文件實現網盤搜索

標題起的太大了,都是騙人的。最近使用PHP實現了簡單的網盤搜索程序,而且關聯了微信公衆平臺。用戶能夠經過公衆號輸入關鍵字,公衆號會返回相應的網盤下載地址。就是這麼一個簡單的功能,相似不少的網盤搜索類網站,我這個採集和搜索程序都是PHP實現的,全文和分詞搜索部分使用到了開源軟件xunsearch,如今就來介紹一下實現過程。php

1. 獲取一批網盤用戶mysql

2. 根據網盤用戶獲取分享列表web

3. xunsearch實現全文檢索和分詞檢索sql

4. 微信公衆平臺接口開發數據庫

 

 

功能展現:json

 

獲取並採集百度網盤用戶瀏覽器

要想獲取到分享列表,首先要先把百度的用戶信息收集下來,如今我來介紹如何找到一大批百度的用戶。先把瀏覽器的審查元素打開,查看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 (分頁起始編號) ; 剩下的參數全都並沒有任何卵用。curl

精簡後的接口地址是: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獲取分享列表,而且入庫

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

相關文章
相關標籤/搜索