在上一篇博客python模拟新浪微博登陆之获取cookies中,已经实现了登陆新浪微博并把cookie保存了下来。接下来通过得到的cookie去访问新浪微博其他页面,并获取我们想要的信息。
顺便一提,我的软件是python2.7.10(64位),IDE是pycharm,win8.1系统环境。所用到的包是base64、rsa、binascii、re、requests。
这里,我首先通过访问自己新浪微博主页获取我的所有微博;
然后进入我的关注用户页面,获取我关注用户的用户ID、用户名;
最后分别进入各个用户的微博主页获取所有微博。
另外,python3的代码,请看:http://bgods.cn/blog/post/29/
###1.获取我的uid与用户名
以下是获取我的uid与用户名的详细代码,使用时需要cookies参数。
def get_myuid(cookies):
url = 'http://weibo.com/'
html = requests.get(url,cookies=cookies).content #用get请求加入cookies参数登陆微博主页
a = html.find('[\'uid\']=')
b = html[a:].find(';')
myuid = html[a + len('[\'uid\']='): a + b][1:-1] #获取我的uid
a = html.find('[\'nick\']=')
b = html[a:].find(';')
myname = html[a + len('[\'nick\']='): a + b][1:-1] #获取我的用户名
return myuid,myname
使用以下命令,可以将返回的两个字符串分别赋值给变量myuid、myname
myuid,myname = get_myuid(cookies)
###2.获取我关注用户的uid、用户名
以下是函数get_follow(myuid,cookies)的代码,可以获取我关注用户的uid、用户名。
def get_follow(myuid,cookies):
'''获取微博关注用户的uid与用户名'''
url = 'http://weibo.com/' + myuid + '/follow'
html = requests.get(url,cookies=cookies).content
c = html.find('member_ul clearfix')-13
html = html[c:]
u = re.findall(r'[uid=]{4}([0-9]+)[&nick=]{6}(.*?)\\"',html)
user_id = []
uname = []
for i in u:
user_id.append(i[0]) #把uid储存到列表user_id中
uname.append(i[1]) #把用户名储存到列表uname中
return user_id,uname #返回两个列表
###3.获取微博
通过以下url可以直接进入访问用户的微博页面,其中uid是前面提到uid。通过改变uid可以访问不同用户的微博页面;把profile改为fans(follow)可以访问用户的粉丝(关注)页面。
url = 'http://weibo.com/'+uid+'/profile'
以下是get_weibo(uid,cookies,page)函数的代码,这里我使用的是普通的正则匹配、re模块。
def get_weibo(uid,cookies,page):
'''获取我的前page页的微博'''
url = 'http://weibo.com/'+uid+'/profile'
my_weibo = []
for p in range(1,page+1):
#新浪微博每一页信息是异步加载的,分三次加载,而且提交的参数都不同
for pb in range(-1,2):
data = {'pagebar':str(pb),
'pre_page':str(p),
'page':str(p),
}
if p == 1:
if pb == -1:
html = requests.get(url,cookies=cookies).content
else:
html = requests.get(url,cookies=cookies,params=data).content
else:
html = requests.get(url,cookies=cookies,params=data).content
hlist = html.split('node-type=\\"feed_list_content\\"')[1:]
for i in hlist:
i = i.split('<\/div>')[0]
s = re.findall('>(.*?)<',i)
weibo = ''
for j in s:
weibo = weibo + j.strip('\\n /\\')
if len(weibo) != 0:
my_weibo.append(weibo) #如果提取的信息不为空,则保存到列表my_weibo中
return my_weibo #返回一个微博信息列表
###4.获取微博并保存到文本
利用前面编写的Get_cookies(username,password)、get_myuid(cookies)、get_follow(myuid,cookies) 以及get_weibo(uid,cookies,page)四个函数,就可以获取自己以及关注用户的uid、用户名、微博信息。以下是代码
cookies = Get_cookies(username,password) #获取登陆后的cookies
myuid,myname = get_myuid(cookies) #获取我的uid与用户名
uid,uname = get_follow(myuid,cookies) #获取关注用户的uid与用户名
s = open('user_weibo.txt','a')
for i in range(len(uid)):
my_weibo = get_weibo(uid[i],cookies,3) #获取用户前三页的微博信息
for j in my_weibo:
s.write(uid[i]+' '+uname[i]+' '+j+'\n')
print str(i+1)+'/'+str(len(uid)) #显示获取进度
s.close()
print '所有用户获取完成'
至此,获取新浪微博信息完成。至于进一步获取关注用户的子用户的微博信息,这里就不做了。
基本思路:其实也很简单,只要再编写一个获取子用户的uid的函数就可以了,获取uid之后,再利用get_weibo(uid,cookies,page)函数就可以获取微博信息了;之后再循环利用编写的函数与get_weibo(uid,cookies,page)就可以获取无穷多的子用户微博信息。
我是分割线====
以下是完整代码:
#-*- encoding:utf-8 -*-
import requests
import re
import base64,rsa,binascii
username = '这里输入用户名' #用户名
password = '这里输入密码' #密码
def Get_cookies(username,password):
'''登陆新浪微博,获取登陆后的Cookie,返回到变量cookies中'''
url = 'http://login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&client=ssologin.js(v1.4.15)%'+username
html = requests.get(url).content
servertime = re.findall('"servertime":(.*?),',html,re.S)[0]
nonce = re.findall('"nonce":"(.*?)"',html,re.S)[0]
pubkey = re.findall('"pubkey":"(.*?)"',html,re.S)[0]
rsakv = re.findall('"rsakv":"(.*?)"',html,re.S)[0]
username = base64.b64encode(username) #加密用户名
rsaPublickey = int(pubkey, 16)
key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到
passwd = rsa.encrypt(message, key) #加密
passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
login_url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)'
data = {'entry': 'weibo',
'gateway': '1',
'from': '',
'savestate': '30',
'userticket': '1',
'ssosimplelogin': '1',
'vsnf': '1',
'vsnval': '',
'su': username,
'service': 'miniblog',
'servertime': servertime,
'nonce': nonce,
'pwencode': 'rsa2',
'sp': passwd,
'encoding': 'UTF-8',
'prelt': '115',
'rsakv' : rsakv,
'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META'
}
html = requests.post(login_url,data=data).content
urlnew = re.findall('location.replace\(\'(.*?)\'',html,re.S)[0]
html = requests.get(urlnew)
cookies = html.cookies
return cookies
def get_myuid(cookies):
url = 'http://weibo.com/'
html = requests.get(url,cookies=cookies).content #用get请求加入cookies参数登陆微博主页
a = html.find('[\'uid\']=')
b = html[a:].find(';')
myuid = html[a + len('[\'uid\']='): a + b][1:-1] #获取我的uid
a = html.find('[\'nick\']=')
b = html[a:].find(';')
myname = html[a + len('[\'nick\']='): a + b][1:-1] #获取我的用户名
return myuid,myname
def get_weibo(uid,cookies,page):
'''获取我的前page页的微博'''
url = 'http://weibo.com/'+uid+'/profile'
my_weibo = []
for p in range(1,page+1):
#新浪微博每一页信息是异步加载的,分三次加载
for pb in range(-1,2):
data = {'pagebar':str(pb),
'pre_page':str(p),
'page':str(p),
}
if p == 1:
if pb == -1:
html = requests.get(url,cookies=cookies).content
else:
html = requests.get(url,cookies=cookies,params=data).content
else:
html = requests.get(url,cookies=cookies,params=data).content
hlist = html.split('node-type=\\"feed_list_content\\"')[1:]
for i in hlist:
i = i.split('<\/div>')[0]
s = re.findall('>(.*?)<',i)
weibo = ''
for j in s:
weibo = weibo + j.strip('\\n /\\')
if len(weibo) != 0:
my_weibo.append(weibo)
return my_weibo
def get_follow(myuid,cookies):
'''获取微博关注用户的uid与用户名'''
url = 'http://weibo.com/' + myuid + '/follow'
html = requests.get(url,cookies=cookies).content
c = html.find('member_ul clearfix')-13
html = html[c:]
u = re.findall(r'[uid=]{4}([0-9]+)[&nick=]{6}(.*?)\\"',html)
user_id = []
uname = []
for i in u:
user_id.append(i[0]) #把uid储存到列表user_id中
uname.append(i[1]) #把用户名储存到列表uname中
return user_id,uname
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cookies = Get_cookies(username,password) #获取登陆后的cookies
myuid,myname = get_myuid(cookies) #获取我的uid与用户名
uid,uname = get_follow(myuid,cookies) #获取关注用户的uid与用户名
s = open('user_weibo.txt','a')
for i in range(len(uid)):
my_weibo = get_weibo(uid[i],cookies,3) #获取用户前三页的微博信息
for j in my_weibo:
s.write(uid[i]+' '+uname[i]+' '+j+'\n')
print str(i+1)+'/'+str(len(uid))
s.close()
print '所有用户获取完成'
====================================================================
请看下一篇:python使用cookie登陆新浪微博用户信息
欢迎访问我的个人站点:http://bgods.cn/