新博客地址:http://gorthon.sinaapp.com/ # _*_ encoding:cp936 _*_ import re import urllib2 import sys, os, time import urllib import cookielib class Xiaonei: def __init__(self, email, password, domain='renren.com', after_login_url='http://www.renren.com/home'): self.email = email self.password = password self.domain = domain self.after_login_url = after_login_url self.handle = None self.operate = '' self.cookie = cookielib.LWPCookieJar() if os.path.isfile('xiaonei.coockie'): self.cookie.revert('xiaonei.coockie') self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie)) urllib2.install_opener(self.opener) def login(self): ''' 执行登录操作,无返回值。 ''' userinfo = {'email':self.email, 'password':self.password} print '登录中...' '''校内的源码类似于: <label for="email">帐号:</label> <input type="text" name="email" class="input-text" id="email" tabindex="1" value=""/></p> <p class="clearfix"> <label for="password">密码:</label> <input type="password" id="password" name="password" error="请输入密码" class="input-text" tabindex="2" /> </p> ''' request = urllib2.Request('http://www.renren.com/PLogin.do', urllib.urlencode(userinfo)) self.operate = self.opener.open(request) if self.operate.geturl() == self.after_login_url: print '登录成功.' self.cookie.save('xiaonei.coockie') print '退出登录.' else: print '登录失败.' def getFriendList(self,url='http://friend.renren.com/myfriendlistx.do'): ''' 返回一个包含dict的list(一个字典表示一个friend)形如: friends = [{"id":110110110,"vip":False,"selected":True,"mo":False,"name":"张三", "head":"http://pic/head.jpg","groups":[]}] ''' result = self.opener.open(urllib2.Request(url)) html = result.read() ''' 查看源码得到如下结果: friends=[{ # 开头 "id":231325364,"vip":false,"selected":true,"mo":false,"name":"/u8521/u620a/u9999", "head":"http:hdn.xnimg.cn//photos//hdn521//20091010//2235//tiny_kFQu_9925e019116.jpg", "groups":[ ]}]; # 结尾 ''' self.friends = re.search(r'friends=/[{.*?/]}/];', html).group() # 此时self.friends='friends=[{"id":231......]}];' self.friends = self.friends[8:-1] # 此时self.friends='[{"id":231......]}]' self.friends = self.friends.replace('true','True') self.friends = self.friends.replace('false','False') self.friends = self.friends.replace(r'//','/') self.friends = eval(self.friends) # self.friends = [{"id":231......]}] 是个包含字典的list for friend in self.friends: # friend是dict类型 friend['name'] = eval(" u'%s' "%friend['name']) # 改变friend同时会自动改变self.friends # 上述操作之后self.friends是格式化好了的[{"id":231......]}] # cPickle.dump(self.friends, file('friendlist.cpikle', 'w')) return self.friends def getFriendId(self, friendname): ''' 返回一个字典。为避免重名,此字典以id为key,以name为value ''' friendname = friendname.decode('cp936') result = {} for friend in self.getFriendList():# friend是字典 if friendname in friend['name']: result[friend['id']] = friend['name'] return result def downloadFriendHeadPicture(self, *friendname): ''' 如果len(friendname)=0则表示下载全部好友头像,否则下载friendname指定好友的头像 ''' if not os.path.exists('pic/'): os.mkdir('pic/') if not len(friendname): for friend in self.getFriendList():# friend是字典 headurl = friend['head'] headdata = urllib2.urlopen(headurl).read() file('pic/%s.jpg'%friend['name'], 'wb').write(headdata) time.sleep(0.02) else: tmp = [] for find1 in map(self.findFriend, friendname): for friend in find1: tmp.append(friend)# tmp为所以包含关键字的list(元素为字典数据的friend) friendname = [i.decode('cp936') for i in friendname] for onename in friendname: pattern = re.compile(onename, re.IGNORECASE) for friend in tmp:# friend是字典 if pattern.search(friend['name']) is not None: headurl = friend['head'] headdata = urllib2.urlopen(headurl).read() file('pic/%s.jpg'%friend['name'], 'wb').write(headdata) time.sleep(0.02) print '下载完成.' def findFriend(self, friendname): ''' 返回一个包含结果(结果为friend字典)的list,长度为人名的个数(不重名情况下一般为1) ''' tmplist = [] friendname = friendname.decode('cp936') pattern = re.compile(friendname, re.IGNORECASE) for friend in self.getFriendList(): if pattern.search(friend['name']) is not None: tmplist.append(friend) return tmplist if __name__ == '__main__': user = Xiaonei('你的Email', '你的密码') user.login() ''' for friend in user.getFriendList():# friend 是字典 print friend['name'], len(friend['name']) ''' #print user.getFriendId('-').keys()[0], user.getFriendId('-').values()[0] #user.downloadFriendHeadPicture('王','成','李') #user.downloadFriendHeadPicture() ''' friend = user.findFriend('李') for i in xrange(len(friend)): print '/n >>>>>>>>>>>>>>>>%s>>>>>>>>>>>>>>'%friend[i]['name'] for k, v in friend[i].items(): print k, ':', v print '---------------------' '''