05月 15

模拟登录人人网并进行简单爬取

Published at May 15, 2014 • Python Crawler

下面,我将使用使用Python的urllib和BeautifulSoup4库实现简单的人人网爬虫

流程是:

  • 先模拟登录进入人人网
  • 然后寻找自己个人主页值得爬取的内容

使用urllib进行模拟登录

由于要使用cookie,所以urllib.urlopen()不再满足我们的需求,我们需要自定义opener。使用处理HTTP cookie的应用进程HTTPCookieProcessor。然后将自己的注册邮箱和密码post到login url。同时,为了要模拟伪装成浏览器,需要加上headers

class renren(object):  

    def __init__(self, email, passwd):  
        self.email = email  
        self.passwd = passwd  
        self.cookie = cookielib.CookieJar()  
        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))  
        self.headers = {  
            'User-Agent':  
                'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/28.0.1500.52 Chrome/28.0.1500.52 Safari/537.36'  
        }  
        self.login_url = 'http://www.renren.com/PLogin.do'  
        self.response = None  
        self.content = None  
        self.soup = None  

    def login(self):  
        data = {  
            'email': self.email,  
            'password': self.passwd  
        }  
        post_data = urllib.urlencode(data)  
        req = urllib2.Request(url=self.login_url, data=post_data, headers=self.headers)  
        self.response = self.opener.open(req)  
        self.content = self.response.read()  
        self.soup = BeautifulSoup(self.content)

利用BeautifulSoup4进行HTML解析

我选择最简单的两个内容进行爬取:

  • 最近来访
  • 今日谁过生日

先分析首页源代码:我发现所有最近来访的人和来访日期都在<span class="tip-content"></span>

<span class="tip-content">陈子敬 Mark 5月12日</span>

所以,先找出所有这种标签,然后循环取出其中的文字信息即可

soup.findAll('a', {'class': 'uname'})

好友生日也是这么分析的,代码如下:

soup.findAll('a', {'class': 'uname'})

将两个内容封装成两个函数:

def recent_visit(self):  
        visits = []  
        all_rencent_visit = self.soup.findAll('span', {'class': 'tip-content'})  
        for one_visit in all_rencent_visit:  
            t = one_visit.get_text()  
            visits.append(t)  
        visits[0] = '最近来访:'  
        return visits  

def today_birthday(self):  
    today_birthdays = []  
    all_today_birth = self.soup.findAll('a', {'class': 'uname'})  
    for one_birth in all_today_birth:  
        t = one_birth.get_text()  
        today_birthdays.append(t)  
    return today_birthdays

就是这么简单和无聊