<?php/×只为了证明PHP是最好的语言。目前设计的该程序是顺序执行,生产和消费者没有分开,使用来一个死循环,不断从redis的list里取出最新的QQ号码,然后用该QQ号码拼接出需要网站的地址,一次访问并存入mongodb,这里只是整个实现的流程代码,没有写QQ空间API接口。由于我分析的接口返回的是json,所以我直接存入mongodb。回来分析也非常方便。为了加大速度,我目前开了10进程,虽然没有到腾讯封IP的极限,但是以及到来我的笔记本的极限了。10个进程24小时可以采集180W,如果电脑配置高点,一天200多万不是问题。其中,懒得自己写curl类,用之前大神爬取知乎的时候写的类https://github.com/hhqcontinue/zhihuSpider××/include "phpspider/config.php";include "phpspider/cache.php";include "phpspider/rolling_curl.php";$cookie = trim(file_get_contents("cookie.txt"));$curl = new rolling_curl();$curl->set_cookie($cookie);$curl->set_gzip(true);$curl->callback = function($response, $info, $request, $error) { preg_match("#xxxxx#", $request['url'], $out); $qq = $out[1]; if (empty($response)) { file_put_contents("./data/error_timeout.log", date("Y-m-d H:i:s") . ' ' . $username.' --- '.json_encode($error)."\n", FILE_APPEND); // 注意这里不要用 exit,否则整个程序就断开了 return; } // 如果是个人信息 if (strpos($request['url'], 'a') ==true ) { //将信息添加至mongodb,先判断是否是错误信息 } //如果是来访QQ if (strpos($request['url'], 'b') == true) { //将信息添加至mongodb,先判断是否是错误信息 //从中取出QQ号码存入redis cache->get_instance()->lpush("qq");//一定要从左端插入,否则是出现死循环,例如A访问来B空间,B同样也访问来A空间,如果在设置网址的时候取先存入的QQ,程序就会不断在A和B之间访问,如果设置网址的时候取最新的则会将他们存入栈底部 } //如果是说说 if (strpos($request['url'], 'c') == true) { ///将信息添加至mongodb,先判断是否是错误信息 } };while(true){ $qq=cache->get_instance()->lpop("qq");//用从左端删除 if ($qq=="")$qq="12345678";//这里是登录的QQ号码 $url = "http://a".$qq;//个人信息 $curl->get($url); $url = "http://b".$qq;//来访QQ $curl->get($url); $url = "http://c".$qq;//最近说说 $curl->get($url); $data = $curl->execute(); // 睡眠100毫秒,太快了会被认为是ddos usleep(100000);}
因为,生产者和消费者没有分开,所以其中有一个问题,就是生产者产生的QQ号码多,消费者使用速度低,所以建议将采集QQ来访者和采集数据分开,采集数据可以多开写进程
用到的类库地址https://github.com/hhqcontinue/zhihuSpider