[PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索详解编程语言

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

1. 获取一批网盘用户

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

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

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

 

 

功能展示:

[PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索详解编程语言[PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索详解编程语言

 

获取并采集百度网盘用户

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

[PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索详解编程语言

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获取分享列表,并且入库

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

[PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索详解编程语言

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/12587.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论