您的位置  > 互联网

爬取人人网的数据爬去了网站的登录之路

前言

一开始我打算爬取人人网的数据,因为我想对我的人人网数据做一个备份。 然而,后来它误入歧途,最终爬上了朋友网。 (PS成功又跑偏了)。 作为一个严重拖延者,这个爬虫本来是在人人网倒卖的时候写的,只是把数据爬了回来,让数据静静地躺在家里的树莓派里。

准备

爬取一个网站的数据,首先要分析该网站以及该网站中想要获取数据的数据接口。 与之前从大麦网(资讯网站)获取数据不同,这里我们解决用户登录和保存的问题。 人人网作为曾经流行的社交网站,对于登录认证做了一些加固,不像一些网站明文传输密码。 相反,密码信息是加密的。 就在前段时间,我在尝试爬取一些漫画网站的时候,看到了一种用+来模拟浏览行为来获取动态加载的漫画图片的方法。 同样出于懒惰,我决定尝试使用+来绕过人人登录。

尝试

决定使用+作为这个爬虫的技术框架后,我们就开始准备环境搭建。 总体来说,环境搭建比较简单。

安装

下载

您可以选择合适的操作系统从官网下载最新版本的程序[1],官网还提供源码下载。

完成基础环境的准备后,就可以开始数据爬取了。

from selenium import webdriver
driver = webdriver.PhantomJS('/Users/tian/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs')
driver.set_window_size("800","600")
driver.get('http://renren.com')
print("---------------***************---------------------")
input1 = driver.find_element("id", "email")
input1.send_keys("****")
input2 = driver.find_element("id", "password")
input2.send_keys("*****")
driver.find_element("id", "login").click()

使用+模拟登录人人网的代码如上。 通过拉起无界面浏览器。 后面的操作和选择器类似,找到自己需要使用的元素,然后设置相关参数。

虽然绕过人人网的登录操作很容易,但也不是没有问题。 在并发情况下,性能并不是很理想。 最终我放弃了使用+的方式来爬取数据。

分析与设计

由于 + 性能无法满足需求,所以我们不能使用惰性方法来获取数据。 我们只能一步步分析登陆页面。 最后在网上找到了以前的经验(链接[2])。 作者使用js实现了人人登录的密码加密方法。 于是我就利用了“胶水语言”的特性和强大的类库支持,本着不重复发明轮子的原则,无耻地使用了它。

现在登录密码加密的问题已经解决了,我们就可以进行下一步的爬取关系网络了。 社交网络有六度理论,所以一开始我想从自己的人人账号开始,爬取六度好友,得到所有人人用户的关系网络。 但这个过程应该是一个先发散后收敛的过程。 人人网拥有数亿用户,单任务爬取并不是一个可行的解决方案。 需要进行分布式爬取,但是使用现有的分布式爬取框架感觉有点笨重,所以针对这个爬取设计了如下的架构。

这里redis有两个功能,一是我们经常使用的共享缓存功能,二是借用redis中的队列数据结构来解耦任务,用于好友关系数据的多个分布式爬取。 同时,为了避免重复爬取导致任务无法结束的问题,通过redis过滤获取了用户信息,从而避免了无限爬取。

login/是比较特殊的,负责登录并把信息缓存到redis中以供其他使用,然后获取数据源的好友信息放入redis队列中,然后消费redis队列中的任务信息像其他人一样,执行分布式爬行。

为了进一步提高效率,设计采用线程池+线程来爬取数据。 由于树莓派的内存限制,最终只爬取了我自己账号的三度好友的数据。

ps爬虫代码已上传至中国(传送门[3])

总结

这个爬虫的准备一开始走了很多弯路,也有一些固定思维的原因。 一开始我主观地选择了+的方式,没有考虑导入的数据量和爬取效率的问题。 同时,也反映出前期准备时没有仔细分析目标网站连接,导致选择出现偏差。 这样就做了很多无用的工作,需要以后注意。

[1] 官方网站:

[2]链接:

[3] 传送门: