PHP写的人人网好友爬虫

本文分享了一种使用PHP实现人人网好友爬虫的方法,重点在于模拟登录过程,通过cURL发送携带cookie的HTTP请求。由于人人网的登录机制,需要解析登录所需的cookie参数,这些参数可以通过Wireshark等工具从HTTP包中获取。文章指出,对于其他网站的模拟登录,可能需要处理不同的加密和POST变量。作者提醒,由于版权和道德问题,不提供源代码下载,但愿意为有需要的人提供帮助。
摘要由CSDN通过智能技术生成

转载一定要注明出处!http://blog.csdn.net/u011852230/article/details/40738475,谢谢

做个申明,介于原来把自己做的东西上传到CSDN下载,被人下了后又做为自己的上传。我就不上传源代码了,有需要的留言就是了。

好了废话少说入正题

1、对于爬取这种社交网络有一大障碍就是模拟登录,也就是发送cookie,你大致可以理解为模拟浏览器重复打开一个页面不用重新登录,因为浏览器客户端已经记录了你的身份信息,并把它放进http包里又发过去了,否则你爬取的网页源代码只能是登录界面,所以就别想着用fopen,file_get_contents这种关键字了,直接上curl,如果php报错没有,打开php.ini里面把相应注释去掉就行,补充:如果用的phpnow集成环境,那应该是在php2apachehandler.ini里,记不清了。curl代码我直接贴,想了解这个的可以去查,待会主要讲讲傻缺的人人网身份信息的cookie是多么low。

function updateRenren($renren_username,$renren_password,$tried_times){ 
        if($tried_times>=3){ 
                return false; } 
				global $ch,$cookie_save;
        $cookie_jar=tempnam('./cookie','renren'); 
        $ch=&getCurl($cookie_jar,"POST","http://www.renren.com/ajaxLogin/login"); 
        curl_setopt($ch,CURLOPT_POSTFIELDS,'email='.urlencode($renren_username).'&password='.urlencode($renren_password).'&origURL=http%3A%2F%2Fwww.renren.com%2FHome&domain=renren.com&key_id=1&captcha_type=web_login&_rtk=90ae5f12'); //注意这一行,就是人人网需要接收的cookie了
        $str=&justsend($ch); 
		$cookie_save=$cookie_jar; 
} 
  
function &getCurl($jar,$method,$url){ 
        $ch=curl_init(); 
        curl_setopt($ch,CURLOPT_COOKIEJAR,$jar); 
        curl_setopt($ch,CURLOPT_COOKIEFILE,$jar); 
        curl_setopt($ch,CURLOPT_URL,$url); 
        curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE); 
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); 
        curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"); 
        //curl_setopt($ch,CURLOPT_VERBOSE,true); 
        if($method=="POST"){ 
        curl_setopt($ch,CURLOPT_POST,TRUE); 
        }else{ 
        curl_setopt($ch,CURLOPT_POST,FALSE); 
        } 
        return $ch; 
} 
  
function &sendAndResult(&$ch){ 
        $str=curl_exec($ch); 
		curl_close($ch);
		unset($ch); 
		global $str_global;
		$str_global=$str;
        return $str; 
}
function &justsend(&$ch)
{       $str=curl_exec($ch);
		curl_close($ch);
		unset($ch); 
        return $str;
}
上面看着这么多,其实许多都是固定格式,想了解更多curl函数的,可以查一下手册,了解一下它的option,我这里重点讲一下这句
curl_setopt($ch,CURLOPT_POSTFIELDS,'email='.urlencode($renren_username).'&password='.urlencode($renren_password).'&origURL=http%3A%2F%2Fwww.renren.com%2FHome&domain=renren.com&key_id=1&captcha_type=web_login&_rtk=90ae5f12');

$ch类似于url请求的POST句柄,CURLOPT_POSTFIELDS翻译一下就是CURL选项_POST域,那说明是通过POST格式发送cookie,cookie的内容为将用户名和密码进行URL格式编码后加上origURL、domain、key_id-----一个&后面就是一个变量,除了账号密码需要我们用变量现存进去,其他就不用管了,这些都是用wireshark抓的http包分析出来的,有兴趣的可以自己试试这,如果想模拟登录其他网站也一样,不过我想提醒一下,模拟登陆新浪微博有点麻烦,需要通过它的js包加密,而且POST的变量更多。

其实可以直接复制上面代码,直接用函数就行了。

updateRenren($usename,$password,0);                   
$url="www.renren.com";
$ch = &getCurl($cookie_save,"GET",$url);//$cookie_save声明在updateRenRen里面的。
$fcontents= &sendAndResult($ch);//获得了人人网相应用户界面的源代码
获得了源代码后,首先要取得你的用户ID,这个时候就分析源码,找到有相关值的代码区,这时候有两种方法,一种是将获得的源代码当做xml解析,直接分析标签节点得到相关内容就行了,另一种是自己写正则匹配表达式,将那一段字符串匹配出来。我推荐第二种,因为第一种经常报错,这要提一点,最新W3协会强烈要求标签自封闭,就是因为曾经的某些标签诸如<meta><img><br>不自封闭一样能解析,导致无法将html解析成dom结构。我给出我的正则匹配式供参考。当然相信各位肯定能写出更简单的式子。

<span style="font-size:12px;">$str="#<a accesskey=\"1\" href=\"http://www.renren.com/[0-9]{8,9}\" ui-async=\"async\">#";
preg_match($str,$fcontents,$get_id);
$get_id[0]=preg_replace("#<a accesskey=\"1\" href=\"http://www.renren.com/#","",$get_id[0]);
$get_id[0]=preg_replace("#\" ui-async=\"async\">#","",$get_id[0]);
$home_id=$get_id[0];</span>
preg_match,preg_replace,preg_match_all这三个正则匹配的函数一定要记住。获得了home_id后,需要找到好友列表,本来我还在想怎么正则匹配出那个入口,结果在网上发现说,人人网有一个固定的URL。当当当!“http://friend.renren.com/GetFriendList.do?curpage=&id=”curpage和id都需要你来填,curpage当然是填页数(0~最后一页-1),id当然是你的$home_id啦,我们在不知道一共有多少页的时候先将curpage=0,进去以后再正则匹配出一共有多少页。对了,每请求一次网页都要发送cookie哦,看代码!!
$url="http://friend.renren.com/GetFriendList.do?curpage=0&id=".$home_id;//起始地址
$ch = &getCurl($cookie_save,"GET",$url);
$fcontents= &sendAndResult($ch);
preg_match($str_page,$fcontents,$get_page);
$get_page[0]=preg_replace("#<a title=[\S]* href=\"/GetFriendList.do\?curpage=#","",$get_page[0]);
$get_page[0]=preg_replace("#&[\S]* »</a>#","",$get_page[0]);
然后我们就该匹配出每位好友了,匹配好友我们需要取出两样东西,一是好友ID,这个留着去爬取这位好友的所有好友,不过这个我就不写了,因为内容大致一样。另一个就是好友的名字,还是正则匹配,所以还是看代码吧。

$username;
$userid;
$i=0;//username,userid的编号。
$str_html="#<dd><a href=\"http://www.renren.com/profile.do\?id=[0-9]{8,9}\">[\S]*[ ]{0,1}[\S]*</a>#i";
$str_id="#<dd><a href=\"http://www.renren.com/profile.do\?id=[0-9]{8,9}#i";
$str_page="#<a title=[\S]* href=\"/GetFriendList.do\?curpage=[0-9]{1,2}&[\S]* »</a>#is";
for($t=0;$t<=$get_page[0];$t++)
{$url="http://friend.renren.com/GetFriendList.do?curpage=".$t."&id=".$home_id;

$ch = &getCurl($cookie_save,"GET",$url);
$fcontents= &sendAndResult($ch);
preg_match_all($str_html,$fcontents,$re[0],PREG_SET_ORDER);
//$num=count($reg);
//echo"$num<br/>"; 
foreach($re[0] as $reg)
{
$temp=preg_replace("#<dd><a href=\"http://www.renren.com/profile.do\?id=[0-9]{8,9}\">#","",$reg[0]);
$username[$i]=preg_replace("#</a>#","",$temp);
preg_match($str_id,$reg[0],$id);
$userid[$i]=preg_replace("#<dd><a href=\"http://www.renren.com/profile.do\?id=#","",$id[0]);
$i++;

}
}
这样所有结果就存进$username和$userid啦,剩下就是遍历输出了,大家肯定不甘心只看自己好友对吧,所以拿着userid去继续爬取吧,我用form表单做了一个简易的前端,这样就不用把账号密码写进代码了,而且还增加了一个input输入朋友名,这样就可以直接检索这个朋友的多有好友,下面演示一下。

                                        

看着我的涂鸦,看官们是不是醉了,抱歉。。。就写到这吧,有什么问题请留言。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值