一直想做一个项目,爬取各个社交网站上与我们学校有关的用户的各种信息,然后分析用户行为。由于人人网的爬虫比较简单,所以最先从人人网爬起。
import re
import urllib2
import mechanize
import cookielib
import HTMLParser
from BeautifulSoup import BeautifulSoup
re库主要用来正则匹配,cookielib库用来设置cookie,BS库和HTMLParser库解析HTML,mezchanize库模拟浏览器行为,对于爬虫来说,这是个很方便的库。
首先创建br对象,模拟浏览器。
def creat_br(self):
# 创建br对象
br = mechanize.Browser()
# 对br进行初始化设置,模拟浏览器
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_gzip(True)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
# 设置请求头的UA
br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11')]
return br
接下来进行登录,利用mechanize登录十分方便,打开登录页面,选中POST Form,填上表单值后直接提交就可以了。
def login(self):
br = self.creat_br()
br.open(url)
# 选中表单
br.select_form(nr=0)
# 下面直接填入账号密码就行
br.form['email'] = str(self.username)
br.form['password'] = str(self.password)
br.submit()
return br
登录后需要按关键词搜索出特定的用户,然后将用户信息爬取下来。人人网每个用户都有一个特定的ID,我们只需要获取每个用户的ID就能根据ID访问他们的个人主页,然后抓取用户资料。
打开用户搜索结果的界面,打开火狐浏览器的firebug,抓取网络请求,刷新页面。成功抓取到用户列表的Request URL。br打开URL,用 BeautifulSoup对页面进行解析,通过寻找标签找到需要获取的内容。
需要注意的细节:
1.用户搜索结果的URL和用户列表的URL不是同一个,如果直接通过打开用户搜索结果的URL来爬取用户信息,爬取到的永远是第一页的用户,无法批量爬取;通过抓取请求得到的用户URL格式如下:
main_url = 'http://browse.renren.com/sAjax.do?ref_search=searchResult_People_Tab&ajax=1&q=KEY_WORDS&p=&s=0&u=842824237&act=search&sort=0&_rtk=e7362bbf&act=search&ajax=1&p=&q=KEY_WORDS&requestToken=460664165&s=0&ss=false&u=842824237&offset=10'
其中参数q为关键词(URL编码),参数offset为页数,改变offset即可批量爬取用户。
2.网页中汉字为16进制的unicode编码,需要进行转码。
3.人人网有反爬虫机制,只有登录后才能查看用户资料,且每浏览100位用户资料后会出现一次验证码。尝试过爬取100位用户后退出登录然后崇信登录,但仍然受限制。反爬虫是绑定用户的。目前还没有找到好的解决方法。
点击下载源码
密码: hu3e