python使用cookie登陆新浪微博用户信息

  在上一篇博客python模拟新浪微博登陆之获取cookies中,已经实现了登陆新浪微博并把cookie保存了下来。接下来通过得到的cookie去访问新浪微博其他页面,并获取我们想要的信息。

  顺便一提,我的软件是python2.7.10(64位),IDE是pycharm,win8.1系统环境。所用到的包是base64、rsa、binascii、re、requests。

  • 这里,我首先通过访问自己新浪微博主页获取我的所有微博;
  • 然后进入我的关注用户页面,获取我关注用户的用户ID、用户名;
  • 最后分别进入各个用户的微博主页获取所有微博。

获取我的uid与用户名

  以下是获取我的uid与用户名的详细代码,使用时需要cookies参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
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

1
myuid,myname = get_myuid(cookies)


获取我关注用户的uid、用户名

  以下是函数get_follow(myuid,cookies)的代码,可以获取我关注用户的uid、用户名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 #返回两个列表

获取微博

  通过以下url可以直接进入访问用户的微博页面,其中uid是前面提到uid。通过改变uid可以访问不同用户的微博页面;把profile改为fans(follow)可以访问用户的粉丝(关注)页面。

1
url = 'http://weibo.com/'+uid+'/profile'

  以下是get_weibo(uid,cookies,page)函数的代码,这里我使用的是普通的正则匹配、re模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 #返回一个微博信息列表


获取微博并保存到文本

  利用前面编写的Get_cookies(username,password)、get_myuid(cookies)、get_follow(myuid,cookies) 以及get_weibo(uid,cookies,page)四个函数,就可以获取自己以及关注用户的uid、用户名、微博信息。以下是代码

1
2
3
4
5
6
7
8
9
10
11
12
13
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 '所有用户获取完成'

  以下是所获取的数据
这里写图片描述

  至此,获取新浪微博信息完成。至于进一步获取关注用户的子用户的微博信息,这里就不做了。


======================我是分割线==========================

以下是完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#-*- 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 '所有用户获取完成'

文章目录
  1. 1. 获取我的uid与用户名
  2. 2. 获取我关注用户的uid、用户名
  3. 3. 获取微博
  4. 4. 获取微博并保存到文本
,