<?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
立即学习“PHP免费学习笔记(深入)”;
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号