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

在上一篇博客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 '所有用户获取完成'

以下是所获取的数据
python使用cookie登陆新浪微博用户信息_第1张图片


至此,获取新浪微博信息完成。至于进一步获取关注用户的子用户的微博信息,这里就不做了。
基本思路:其实也很简单,只要再编写一个获取子用户的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/

你可能感兴趣的:(爬虫,python)