之前没有怎么用过python,也没写过爬虫,最近几天抽空学习了一下,写了个人人网的爬虫练了练手。
用了BeautifulSoup4包来解析HTML标签,Beautiful Soup 是用 Python 写的一个 HTML/XML 的解析器,它可以很好的处理不规范标记并生成剖析树。通常用来分析爬虫抓取的web文档。对于不规则的 Html文档,也有很多的补全功能,节省了开发者的时间和精力。使用起来类似于DOM,还是非常方便的。
地址:http://www.crummy.com/software/BeautifulSoup/
非常良心的中文文档,看过就会:http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
在这里先推荐两个工具,Windows下的fiddler,Linux下基于Firefox的Firebug,前者我没有具体用过,但基本上所有人都说是windows开发下利器,大家可以尝试以下。至于Firebug,也就是类似于chrome的审查元素,只不过是基于Firefox浏览器的,功能还是相当完善的,Firebug如图。
具体实现思路:首先我们知道人人网数据不公开,所以想要获取数据,必须先登陆到人人网,那么用户是怎么登陆的呢,其实写过网页的都知道所谓的登陆只是向服务器的某个特定的链接发出了一个Post请求,这个请求里包含了用户登陆的数据,比如用户名,密码,以及其他一些可能的参数,我们只要能够知道Post的对象,便可以模拟登陆了。
我们先进入到人人网,然后打开浏览器的审查元素(或者Firebug,或者其他),打开网络选项,输入用户名密码之后,点击登陆,查看所有抓取的包中类型为post的包,可以看到很多详细的信息。
同时我们还需要生成一个保存cookie的东西,Python提供一个非常方便的自动保存cookie的组件Cookielib。
还有一个问题就是,之所以要选择3g.renren.com而不是www.renren.com,是因为考虑到网页版人人在”所有状态“的页面内容是通过Ajax生成的,而且获得的数据结构非常乱不管是用BeautifulSoup,还是用正则匹配都比较麻烦,所以我们选择用比较简单的手机版页面来进行抓取。
关于Ajax页面的抓取方法,可以通过PhantomJS+selenium来调用虚拟浏览器获取加载好之后的网页,也可以人工抓包,抓取有用信息,然后通过GET操作获得返回的页面或者JSON文件。这里就不详述了。
登陆代码如下:
try:
self.cookie = cookielib.CookieJar() #设置登陆cookie
self.cookieProc = urllib2.HTTPCookieProcessor(self.cookie)
except:
raise
else:
opener = urllib2.build_opener(self.cookieProc)
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11')]
#浏览器伪装
urllib2.install_opener(opener)
url='http://3g.renren.com/login.do' #登陆人人网3g首页
postdata = {
'email':self.email,
'password':self.password,
}
req = urllib2.Request(url,urllib.urlencode(postdata))
index = urllib2.urlopen(req).read()
indexSoup = BeautifulSoup(index) #首页BeautifulSoup对象,方便进行之后的标签提取等操作
接下来我们开始获取状态信息,有了cookie之后我们每次只需要通过BeautifulSoup找到对应节点的链接,然后把链