通过空间历史浏览,爬出查看你空间的人(一般限制20人,除非开通黄钻),然后在爬出这20人的浏览记录,依次向下爬,你可以控制爬行深度。
这里仅仅给出怕中代码片段,你可以进一步优化,将QQ分类存储。通过QQ相互浏览关系,可以通过绘图工具绘制好友网络。等等

代码涉及pthreads 如果不清楚请阅读:《PHP 高级编程之多线程》
http://netkiller.github.io/journal/thread.php.html

<?php
/*
Homepage: http://netkiller.github.io
Author: Neo <netkiller@msn.com>
*/
if(!extension_loaded('pthreads')) die ('Please install pthreads'); include_once('Snoopy.class.php'); class CrawlerWorker extends Worker { protected static $dbh;
public function __construct() { }
public function run(){
/*
$dbhost = 'db.example.com'; // 数据库服务器
$dbuser = 'example.com'; // 数据库用户名
$dbpw = 'password'; // 数据库密码
$dbname = 'example'; // 数据库名 self::$dbh = new PDO("mysql:host=$dbhost;port=3306;dbname=$dbname", $dbuser, $dbpw, array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
PDO::MYSQL_ATTR_COMPRESS => true,
PDO::ATTR_PERSISTENT => true
)
);
*/
}
protected function getInstance(){
return self::$dbh;
} } /* the collectable class implements machinery for Pool::collect */
class Crawler extends Stackable {
public $depth = 3;
private static $level = 0;
public function __construct($qq) {
$this->qq = $qq;
}
public function run() { try {
$dbh = $this->worker->getInstance();
$this->recursion(array($this->qq));
}
catch(PDOException $e) {
$error = sprintf("%s,%s\n", $mobile, $id );
file_put_contents("mobile_error.log", $error, FILE_APPEND);
}
//printf("runtime: %s, %s\n", date('Y-m-d H:i:s'), $this->worker->getThreadId());
//$lst = $this->qzone($this->qq);
//print_r($lst);
}
public function recursion($qqs){ if( self::$level <= $this->depth){
self::$level++;
}else if(self::$level > 0){
self::$level--;
}
printf("Level: %s\n", self::$level);
//sleep(1);
usleep(mt_rand(10000,1000000));
if(self::$level >= $this->depth){
return;
} foreach($qqs as $uin) {
$lst = $this->qzone($uin);
print_r($lst);
$this->recursion($lst);
}
} public function qzone($qq){
$url = 'http://m.qzone.com/mqz_get_visitor?g_tk=1191852101&res_mode=0&res_uin='.$qq.'&offset=0&count=100&page=1&format=json&t=1401762986882&sid=dODKVcYv6azjN87cxXQ5mao1xgakYjHg18c8aa5e0201%3D%3D';
$snoopy = new Snoopy; // need an proxy?
//$snoopy->proxy_host = "my.proxy.host";
//$snoopy->proxy_port = "8080"; // set browser and referer:
$snoopy->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$snoopy->referer = "http://m.qzone.com/"; // set some cookies:
//$snoopy->cookies["SessionID"] = '238472834723489';
//$snoopy->cookies["favoriteColor"] = "blue"; // set an raw-header:
$snoopy->rawheaders["Pragma"] = "no-cache"; // set some internal variables:
$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false; // set username and password (optional)
//$snoopy->user = "joe";
//$snoopy->pass = "bloe"; // fetch the text of the website www.google.com:
if($snoopy->fetchtext($url)){
// other methods: fetch, fetchform, fetchlinks, submittext and submitlinks // response code:
//print "response code: ".$snoopy->response_code."<br/>\n"; // print the headers:
//print "<b>Headers:</b><br/>";
//while(list($key,$val) = each($snoopy->headers)){
// print $key.": ".$val."<br/>\n";
//} // print the texts of the website:
//print_r( json_decode($snoopy->results) ); $results = array();
$tmp = json_decode($snoopy->results); if($tmp){
if(property_exists($tmp, 'data')){
foreach( $tmp->data->list as $lst ){
$results[] = $lst->uin;
}
}
}
return ($results); }
else {
print "Snoopy: error while fetching document: ".$snoopy->error."\n";
}
}
} $pool = new Pool(100, \CrawlerWorker::class, []); #foreach (range(1000, 100000) as $number) {
# $pool->submit(new Crawler($number));
#} $pool->submit(new Crawler('13721218'));
$pool->submit(new Crawler('291379'));
//$pool->submit(new Crawler('xxx'));
//$pool->submit(new Crawler('xxx'));
//$pool->submit(new Crawler('xxx'));
// 以此类推
//$pool->submit(new Crawler('nnn')); $pool->shutdown();
?>

***PHP多线程pthreads 实现QQ号码爬虫的更多相关文章

  1. QQ空间爬虫最新分享,一天 400 万条数据(附代码地址)

    http://mp.weixin.qq.com/s?__biz=MzAxMjUyNDQ5OA==&mid=2653552228&idx=1&sn=e476bf23556406c ...

  2. 找女神要QQ号码

    引言 我们组来了个美女程序员,我心里窃喜,哈哈这下机会来了.我在想怎么下手呢?好吧,还是从QQ号码开始,找到女神要到QQ号,哈哈,我真是个天才~~~ 是这样子滴 想法是美好的,现实是残酷的,找女神要Q ...

  3. js正则表达式:验证邮箱格式、密码复杂度、手机号码、QQ号码

    直接上代码             Java   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...

  4. 美女程序员是如何将QQ转换成题目中那串数字的--读博文《找女神要QQ号码》

    我只能说好好的端午节你们不约么?,还在这里写代码?我也是够无聊的,下班了不走也在这跟风写着玩!<找女生要QQ号码原文>原文链接http://www.cnblogs.com/iforever ...

  5. JS获得QQ号码的昵称,头像,生日

    这篇文章主要介绍了JS获得QQ号码的昵称,头像,生日的简单实例,有需要的朋友可以参考一下 http://r.qzone.qq.com/cgi-bin/user/cgi_personal_card?ui ...

  6. YII 验证邮箱和QQ号码

    //验证邮箱非空,和邮箱格式                    //验证邮箱非空,和邮箱格式                     array("email","e ...

  7. Java基础知识强化70:正则表达式之引入案例(QQ号码校验)

    1. 校验QQ号码的案例,如下: package cn.itcast_01; import java.util.Scanner; /* * 校验qq号码. * 1:要求必须是5-15位数字 * 2:0 ...

  8. destoon程序中qq号码,手机号,msn必选项实现方法

    最近发现好多客户,信息不完全!还是把qq号码,手机号,msn设为必选项比较好!下面以把qq设为必选项为例找到模板 template/default/member/edit.htm 找到 functio ...

  9. 利用libpcap抓取QQ号码信息

    最近想在QQ登录时把QQ号码信息记录下来,百度了很多都没有找到具体方式,最近用Wireshark分析报文+libpcap库嗅探实现了这个小功能. 通讯背景: QQ客户端在通讯时使用UDP协议,其中数据 ...

随机推荐

  1. QQ粘性效果

    演示如下 QQ粘性效果.zip

  2. ArrayList() 输出

    import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Li ...

  3. ZooKeeper - 状态信息 Stat 的属性说明

    运行%ZK_HOME%/bin目录下的zkCli.sh(zkCli.cmd),使用get命令可以获取指定ZNode的数据内容和属性信息.例如: [zk: localhost:2181(CONNECTE ...

  4. rest的config

    <个人积累,转载请注明出处> 新手写rest wcf经常会报配置文件异常.我为了避免这种问题,将自己配好的config放这里,用的时候将ABC改成自己的,粘贴就行了. ABC是什么我就不赘 ...

  5. QL Server 中四种匹配符的含义

    SQL中我们会见到很多的匹配符,下面解释一下 % 代表零个或者多个任意字符 _ 代表一个任意字符 [] 指定范围内的任意单个字符 [^] 不在指定范围内的任意单个字符 带有匹配符的字符串必须使用引号引 ...

  6. SignalR 跨域设置

    参考文章:http://www.cnblogs.com/nywd/p/3691813.html 上一节,已经实现了,当前域内的通信,这一节中,介绍一下跨域的即时通信,既然要做,我们肯定要把这个推送及聊 ...

  7. LVS概述

    LVS原理概述: lvs是一个开源软件,是Linux virtual server的简写,即linux虚拟服务器,是一个虚拟的服务器集群系统,lvs集群采用ip负载均衡技术和基于内容的请求分发技术.将 ...

  8. C#集合之ArrayList

    C#中之所以有集合这个东东,是因为数组的长度是固定的,而实际需求是,不确定未来这个“数组”的个数,故出现集合这个概念,因为集合的容量会随元素的增加曾倍数增长.C#中有2类常用集合:ArrayList, ...

  9. oracle 表空间常用语句

    –查询表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", ...

  10. Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)

    转载请务必注明出处(all copyright reserved by iOSGeek) 本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina ...