标题起的太大了,都是骗人的。最近使用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获取分享列表,并且入库

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

[PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索的更多相关文章

  1. 爬取百度网盘资源报user is not authorized, hitcode:119

    爬取百度网盘资源报user is not authorized, hitcode:119 一.总结 一句话总结: 可能是百度网盘禁止非客户端环境下载大文件,所以将请求头改为客户端:'User-Agen ...

  2. WebCollector爬取百度搜索引擎样例

    使用WebCollector来爬取百度搜索引擎依照关键字搜索的结果页面,解析规则可能会随百度搜索的改版而失效. 代码例如以下: package com.wjd.baidukey.crawler; im ...

  3. 百度图片爬虫-python版-如何爬取百度图片?

    上一篇我写了如何爬取百度网盘的爬虫,在这里还是重温一下,把链接附上: http://www.cnblogs.com/huangxie/p/5473273.html 这一篇我想写写如何爬取百度图片的爬虫 ...

  4. 利用python的爬虫技术爬取百度贴吧的帖子

    在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...

  5. Java爬虫——网易云热评爬取

    爬取目标网址 :   http://music.163.com/#/song?id=409649818 需要爬取信息 :   网易云top13热评 使用之前的 HttpURLConnection 获取 ...

  6. Python3实现QQ机器人自动爬取百度文库的搜索结果并发送给好友(主要是爬虫)

    一.效果如下: 二.运行环境: win10系统:python3:PyCharm 三.QQ机器人用的是qqbot模块 用pip安装命令是: pip install qqbot (前提需要有request ...

  7. Python开发简单爬虫(二)---爬取百度百科页面数据

    一.开发爬虫的步骤 1.确定目标抓取策略: 打开目标页面,通过右键审查元素确定网页的url格式.数据格式.和网页编码形式. ①先看url的格式, F12观察一下链接的形式;② 再看目标文本信息的标签格 ...

  8. requests+xpath+map爬取百度贴吧

    # requests+xpath+map爬取百度贴吧 # 目标内容:跟帖用户名,跟帖内容,跟帖时间 # 分解: # requests获取网页 # xpath提取内容 # map实现多线程爬虫 impo ...

  9. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

随机推荐

  1. Exchange 2016 体系结构

    Exchange Server 2016 使用一个构建基块体系结构,提供电子邮件服务,以便在各种规模的组织(从小型组织到最大规模的跨国企业)进行部署.这种体系结构如下图所示.包含两个角色,邮箱服务器角 ...

  2. linux下mysql的大小写是否区分设置

    转:http://blog.csdn.net/qq_29246225/article/details/52293549 一.Linux中MySQL大小写详情:1.数据库名严格区分大小写2.表名严格区分 ...

  3. js高程(二)-----继承

    首先来讨论一下原型链,上代码 function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = fun ...

  4. 用PHPExcel类读取excel文件的内容

    这里对PHPExcel类不做介绍,有兴趣的朋友可以自己查阅资料 在classes文件夹下有个PHPExcel.php文件,这个文件是这个类库的主要入口文件,在用之前,要引入这个类 其他的类,在此类中会 ...

  5. 移动web页面支持弹性滚动的3个方案

    有段时间一直折腾移动端页面弹性滚动的各种问题,做了点研究,今天做个小分享~ 传统 pc 端中,子容器高度超出父容器高度,通常使用 overflow:auto 可出现滚动条拖动显示溢出的内容,而移动we ...

  6. 深度学习实践系列(2)- 搭建notMNIST的深度神经网络

    如果你希望系统性的了解神经网络,请参考零基础入门深度学习系列,下面我会粗略的介绍一下本文中实现神经网络需要了解的知识. 什么是深度神经网络? 神经网络包含三层:输入层(X).隐藏层和输出层:f(x) ...

  7. CSS3学习笔记(1)-CSS3选择器

    p{ font-size: 15px; text-indent: 2em; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid ...

  8. POPTEST老李分享修改dns ip的vbs代码

    POPTEST老李分享修改dns ip的vbs代码   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...

  9. 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结

    老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结   本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...

  10. 4.Maven仓库

    1. 何为Maven仓库 Maven仓库就是统一存放所有依赖的地方,其他所有项目都可以在仓库里通过坐标找到所需要的依赖. 2. 仓库的布局 任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中 ...