受欢迎的博客标签

百度网盘的主要思路是先获取用户uk,通过uk可以拿到分享列表,然后获取到分享数据。

Published
百度网盘的主要思路是先获取用户uk,通过uk可以拿到分享列表,然后获取到分享数据。### UK获取的方式:        1. 循环抓取用户的粉丝还有用的订阅! `0 V( b  h+ r2 k4 @, D/ P4 W! J        2. 从各个网盘搜索站点抓取        3. 利用大量关键词从bing搜索,google搜索的结果中提取。        利用上面三种方法总共抓取了大概500W的有效分享用户### 失效链接检测3 A' V  Q  `& l9 X: Z        这个是很多网盘搜索站做的不太好的地方,很多资源都是失效。快速检测失效链接的方法是用head请求判断百度的返回信息就可以知道资源是否有效。用这种方式单台电脑每天能查询1000W左右的资源是否失效。### 百度的反爬虫策略3 A6 C  e/ \- A& z" ^# [3 D4 n        除了限制IP抓取频率外,百度还对同一个UK的最大抓取有限制,超过限制后会随机返回数据。: q5 o# y, c1 n3 k( `3 w$ ]$ |) U- H# N+ }7 \4 f; g. m   爬到数据使用(https://github.com/gudegg/yunSpider) 只需替换链接中uk,shareid或者album_id即可访问 分享专辑链接类型:https://pan.baidu.com/wap/album/info?uk=1112219283&album_id=129732510768224935 普通文件或者文件夹类型:https://pan.baidu.com/wap/link?uk=1112219283&shareid=2109459878 获取用户订阅: http://yun.baidu.com/pcloud/friend/getfollowlist?query_uk=%s&limit=24&start=%s&bdstoken=e6f1efec456b92778e70c55ba5d81c3d&channel=chunlei&clienttype=0&web=1&logid=MTQ3NDA3NDg5NzU4NDAuMzQxNDQyMDY2MjA5NDA4NjU=(query_uk limit start是必须参数) 获取用户粉丝: http://pan.baidu.com/pcloud/friend/getfanslist?query_uk=%s&limit=24&start=%s&bdstoken=null&channel=chunlei&clienttype=0&web=1&logid=MTQ3NDAzNjQwNzg3OTAuNzM1MzMxMDUyMDczMjYxNA== (query_uk limit start是必须参数) 获取用户分享: http://pan.baidu.com/pcloud/feed/getsharelist?t=1474202771918&category=0&auth_type=1&request_location=share_home&start=0&limit=60&query_uk=224534490&channel=chunlei&clienttype=0&web=1&logid=MTQ3NDIwMjc3MTkxOTAuMzA1NjAzMzQ4MTM1MDc0MTc=&bdstoken=e6f1efec456b92778e70c55ba5d81c3d (query_uk limit start auth_type是必须参数) 上面3个连接请求必须带上Referer("Referer", "https://yun.baidu.com/share/home?uk=23432432#category/type=0"),否则请求不到json数据, 获取用户订阅和获取用户粉丝每次请求一次休眠2s的话可以无限制请求,对ip没要求,获取用户分享超坑,一个ip只能请求10次,并且休眠也没用. 因为没有那么多ip,我就去研究手机版的用户分享,手机版获取用户分享可以一次性连续请求60次,60次后必须休眠35s左右在继续请求就可以,不会像pc版那样必须换ip, 但是手机版只能请求网页源码,然后用正则进行匹配. 手机版分享: http://pan.baidu.com/wap/share/home?uk=2889076181&start=%s&adapt=pc&fr=ftw (uk:每个百度网盘用户的唯一标示,start:用户可能有上百上千个分享,必须分页,start默认从0开始,手机版默认分页是20个每页) <-----> 获取并采集百度网盘用户 要想获取到分享列表,首先要先把百度的用户信息收集下来,现在我来介绍如何找到一大批百度的用户。先把浏览器的审查元素打开,查看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,防止重复采集。   查找分享接口 随便找一个网盘用户的分享页面,点击最下面的分页链接,可以看到发起的请求接口,这个就是获取分享列表的接口。 整个的请求url是这个 https://pan.baidu.com/pcloud/feed/getsharelist?t=1493892795526&category=0&auth_type=1&request_location=share_home&start=60&limit=60&query_uk=4162539356&channel=chunlei&clienttype=0&web=1&logid=MTQ5Mzg5Mjc5NTUyNzAuOTEwNDc2NTU1NTgyMTM1OQ==&bdstoken=bc329b0677cad94231e973953a09b46f   调用接口获取数据 使用PHP的CURL去请求这个接口,看看是否能够获取到数据。测试后发现,返回的是{"errno":2,"request_id":1775381927},并没有获取到数据。这是因为百度对header头信息里面的Referer进行了限制,我把Referer改成http://www.baidu.com,就可以获取到数据了。接口的参数也可以进行简化成 https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=60&limit=60&query_uk=4162539356 测试代码如下: <?php /* * 获取分享列表 */ class TextsSpider{ /** * 发送请求 */ 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; } } $textsSpider=new TextsSpider(); $header=array( 'Referer:http://www.baidu.com' ); $str=$textsSpider->sendRequest("https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=60&limit=60&query_uk=4162539356",null,$header); echo $str; 分享列表的json结果如下: { "errno": 0, "request_id": 1985680203, "total_count": 1025, "records": [ { "feed_type": "share", "category": 6, "public": "1", "shareid": "98963537", "data_id": "1799945104803474515", "title": "《通灵少女》2017.同步台视(完结待删)", "third": 0, "clienttype": 0, "filecount": 1, "uk": 4162539356, "username": "a20****3762", "feed_time": 1493626027308, "desc": "", "avatar_url": "https://ss0.bdstatic.com/7Ls0a8Sm1A5BphGlnYG/sys/portrait/item/01f8831f.jpg", "dir_cnt": 1, "filelist": [ { "server_filename": "《通灵少女》2017.同步台视(完结待删)", "category": 6, "isdir": 1, "size": 1024, "fs_id": 98994643773159, "path": "%2F%E3%80%8A%E9%80%9A%E7%81%B5%E5%B0%91%E5%A5%B3%E3%80%8B2017.%E5%90%8C%E6%AD%A5%E5%8F%B0%E8%A7%86%EF%BC%88%E5%AE%8C%E7%BB%93%E5%BE%85%E5%88%A0%EF%BC%89", "md5": "0", "sign": "86de8a14f72e6e3798d525c689c0e4575b1a7728", "time_stamp": 1493895381 } ], "source_uid": "528742401", "source_id": "98963537", "shorturl": "1pKPCF0J", "vCnt": 356, "dCnt": 29, "tCnt": 184 }, { "source_uid": "528742401", "source_id": "152434783", "shorturl": "1qYdhFkC", "vCnt": 1022, "dCnt": 29, "tCnt": 345 } ] } 还是和上次一样,综合性的搜索站,可以把有用的数据都留下存住,我只是做个最简单的,就只要了标题title和shareid 每个分享文件的下载页面url是这样的:http://pan.baidu.com/share/link?shareid={$shareId}&uk={$uk} ,只需要用户编号和分享id就可以拼出下载url。   生成分页接口URL 假设用户最多分享了30000个,每页60个,可以分500页,这样url可以这样生成 <?php /* * 获取分享列表 */ class TextsSpider{ private $pages=500;//分页数 private $start=60;//每页个数 /** * 生成分页接口的url */ public function makeUrl($rootUk){ $urls=array(); for($i=0;$i<=$this->pages;$i++){ $start=$this->start*$i; $url="https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start={$start}&limit={$this->start}&query_uk={$rootUk}"; $urls[]=$url; } return $urls; } } $textsSpider=new TextsSpider(); $urls=$textsSpider->makeUrl(4162539356); print_r($urls); 分页的url结果是这样的 Array ( [0] => https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=0&limit=60&query_uk=4162539356 [1] => https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=60&limit=60&query_uk=4162539356 [2] => https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=120&limit=60&query_uk=4162539356 [3] => https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=180&limit=60&query_uk=4162539356 [4] => https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=240&limit=60&query_uk=4162539356 [5] => https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=300&limit=60&query_uk=4162539356 [6] => https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=360&limit=60&query_uk=4162539356 [7] => https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=420&limit=60&query_uk=4162539356 [8] => https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=480&limit=60&query_uk=4162539356 [9] => https://pan.baidu.com/pcloud/feed/getsharelist?&auth_type=1&request_location=share_home&start=540&limit=60&query_uk=4162539356   数据表存储结构 CREATE TABLE `texts` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL DEFAULT '', `url` varchar(255) NOT NULL DEFAULT '', `time` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `title` (`title`(250)) ) ENGINE=MyISAM    循环读取的时候,应该注意,每次间隔一定的时间,防止被封。     <------> 怎么办?别急,下面给大家介绍一种下载失效资源的方法 看一个例子,比如此链接资源已失效: http://pan.baidu.com/share/link?shareid=76297&uk=3238350839 获取蓝色的部分复制下来就是(3238350839) 这是百度的默认网盘分享主页(红色部分为ID) http://pan.baidu.com/share/home?uk=1899044832 把上面那个红色部分就是(1899044832 )替换到尾部即可,由此得到。 http://pan.baidu.com/share/home?uk=3238350839 打开上面的网址,资源就出现了,有木有? 欢迎大家吐糟~ 我会告诉你在百度文库的wenku前边加wap就能复制文档吗; 我会告诉你在优酷播放页youku后加xia就能直接下载视频吗; 我会告诉你在土豆视频链接后面加?tid=-1就可以跳过45秒广告吗; 别逗了,我怎么可能告诉你!   <-----> 百度蜘蛛Baiduspider User-Agent字段更新与IP判断 Baiduspider+(+http://www.baidu.com/search/spider.htm) 更新后的baiduspider User-Agent字段内容内容为: Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) Baiduspider User-Agent的更新,对于一般网站是没什么影响的,因为一般的网站都没有屏蔽百度蜘蛛,所以你不需要做任何修改;如果你通过robots.txt文件屏蔽了百度蜘蛛,也不需要做任何修改,因为百度蜘蛛名称依然是Baiduspider没变;如果你此前主动在服务器端封禁了百度网页搜索的User-Agent,那么建议修改服务器端要封禁的User-Agent字段,或者更换为robots封禁。 不知道Baiduspider User-Agent的更新,会不会让百度爬虫更加高效、百度的排名机制更加完善。做SEO的人知道,百度搜索的技术与Google不可同日而语,百度蜘蛛的低效、排名机制的不完善,让各位站长和SEOer伤透了脑筋!但是如果做中文站的话,百度的排名是必须要考虑的问题,因为百度在中文搜索领域已经几乎处于垄断地位了!   百度各个产品使用不同的user-agent: 产品名称 对应user-agent 无线搜索 Baiduspider 图片搜索 Baiduspider-image 视频搜索 Baiduspider-video 新闻搜索 Baiduspider-news 百度搜藏 Baiduspider-favo 百度联盟 Baiduspider-cpro 商务搜索 Baiduspider-ads 网页以及其他搜索 Baiduspider   有冒充百度蜘蛛抓取的情况,如何判断呢? 可以使用nslookup ip命令反解ip来 判断是否来自Baiduspider的抓取。 打开命令处理器 输入nslookup xxx.xxx.xxx.xxx(IP地 址)就能解析ip, 来判断是否来自Baiduspider的抓取,Baiduspider的hostname以 *.baidu.com 或 *.baidu.jp 的格式命名,非 *.baidu.com 或 *.baidu.jp 即为冒充。.