python pycurl模块模拟登录人人网抓取好友列表

发布时间:2019-12-27编辑:脚本学堂
python pycurl模块模拟登录人人网的例子,pycurl模块模拟抓取人人网的好友列表,需要的朋友参考下。

使用python pycurl模块抓取好友信息,相比urllib模块要强很多。

首先,第一步要实现的就是如何从人人网上获取自己的好友列表,以及好友好友的列表。这样就能得到周围好友之间关系的一个网络。然后,就可以利用igraph,按照force-based算法分布画出自己的好友分布图。从这张图上就很容易看出好友的聚合情况。

python下curl的绑定(binding)pycurl。(python模块
1.下载好友列表
2.使用正则表达式匹配出好友的姓名与ID,因为人人网下姓名重复的好友情况比较常见,所以,ID才是唯一的标识。
3.使用igraph来绘制好友的force-based分布图。
安装pyCurl 我这里使用的pyCurl是编译的版本,本来想在Windows下开发,结果发现windows下的版本很久已经没有跟新了。PyCurl仅仅支持python2.5,所以,重新在linux下下载pycurl包,进行安装。安装的过程需要编译C代码,这里又要需要python的头文件。所以,又得重新下载pythonX-dev版本。
sudo apt-get install python2.7-dev
下载pycurl:http://pycurl.sourceforge.net/download/pycurl-7.19.0.tar.gz
 

tar xzf pycurl-7.19.0.tar.gz
python setup.py install --curl-config=/usr/local/bin/curl-config
 

这里curl-config是libcurl安装之后的配置信息。使用sudo apt-get install curl安装的版本,没有找到这个文件。所有,到curl的官方网站下载dev版的curl,自己编译。
下载curl:http://curl.haxx.se/download.html,这里最上边有最新的稳定版本。
 

tar xzf curl-7.21.3.tar.gz
./configure
make
make install
 

安装好curl lib之后,可以在/usr/local/bin/curl-config下找到--curl-config,然后执行上边的命令。pycurl安装成功。
使用PyCurl获取人人网好友列表
pycurl的命令最终还是使用的是libcurl的接口,所以必须熟悉Libcurl的常用命令。比较常用的有set_easy_opt().这个命令有很多常量参数,使用比较广泛,可以参考libcurl的文档。当然,需要结合pycurl的文档一起阅读。

这是实现的获取人人好友列表的脚本。如果需要迭代获取所有的好友的好友列表,只需要迭代调用即可。

代码:
 

复制代码 代码示例:
#!/usr/bin/env python
import pycurl
import StringIO
usrname = "youremail"
password = "yourpwd"
logpage = "www.renren.com/ajaxLogin/login"
targetpage = "http://friend.renren.com/GetFriendList.do?curpage=0&id=yourid"
request = "email="+usrname+"&password="+password
crl = pycurl.Curl()
crl.fp = StringIO.StringIO()
crl.setopt(pycurl.URL,logpage)
crl.setopt(crl.WRITEFUNCTION,crl.fp.write)
crl.setopt(pycurl.VERBOSE,1)
crl.setopt(pycurl.POSTFIELDS,request)
crl.setopt(pycurl.FOLLOWLOCATION,1)
crl.setopt(pycurl.MAXREDIRS,5)
crl.setopt(pycurl.COOKIEFILE,'')
crl.perform()
print crl.fp.getvalue()
crl.setopt(pycurl.URL,targetpage)
crl.setopt(pycurl.HTTPGET,1)
crl.setopt(crl.WRITEFUNCTION,crl.fp.write)
crl.perform()
print crl.fp.getvalue()
"http://friend.renren.com/GetFriendList.do?curpage=0&id=yourid"
 

人人网提供的好友列表的网站,只要登录,就可以根据用户ID来访问任意一个人的好友列表。
难点便是登录。使用wireshark抓包,再参考网上的信息,关键在于命令:
 

request = "email="+usrname+"&password="+password
crl.setopt(pycurl.POSTFIELDS,request)
crl.setopt(pycurl.COOKIEFILE,'')
 

使用post提交用户登录表单。这里提交表单的地址是根据wireshark抓包获取的信息确定的。还有,要设置cookie,要不等你访问下一个网址时,连接会被重置。

所以,设置了cookie,会建立一个稳定的连接,虽然这里使用的是一个空的cookie,但是当登录成功之后,curl会帮你填写cookie信息。

因为这里使用了VERBOSE,你会看到这些信息。

然后,使用连接好的curl句柄,访问自己的目标网址,即好友列表网址。这里有一点要注意的是,这里的句柄是使用的上边提交用户名时候的设置,是用POST方式提交的。

但是,这样会返回一个错误。“http/1.1 405 method not allowed”。

因为,apache、IIS、nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回“HTTP/1.1 405 Method not allowed”错误。

而人人使用Nginx服务器,只需要:
crl.setopt(pycurl.HTTPGET,1) 即按照GET的方式提交请求即可。

得到好友列表网站的html源码,而并不是具体的好友姓名,uid数据。

然后,从这些html文件中使用正则表达式匹配出需要的信息。