<?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