当前位置: 移动技术网 > IT编程>脚本编程>Python > python模拟新浪微博登陆功能(新浪微博爬虫)

python模拟新浪微博登陆功能(新浪微博爬虫)

2019年04月02日  | 移动技术网IT编程  | 我要评论

镖行天下之至尊国宝,金秋芬年轻时,李立宏

1、主函数(weibomain.py):

复制代码 代码如下:

import urllib2
import cookielib

import weiboencode
import weibosearch

if __name__ == '__main__':
    weibologin = weibologin('×××@gmail.com', '××××')#邮箱(账号)、密码
    if weibologin.login() == true:
        print "登陆成功!"

前两个import是加载python的网络编程模块,后面的import是加载另两个文件weiboencode.py和weiboseach.py(稍后介绍)。主函数新建登陆对象,然后登陆。

2、weibologin类(weibomain.py):

复制代码 代码如下:

class weibologin:
    def __init__(self, user, pwd, enableproxy = false):
        "初始化weibologin,enableproxy表示是否使用代理服务器,默认关闭"

        print "initializing weibologin..."
        self.username = user
        self.password = pwd
        self.enableproxy = enableproxy

        self.serverurl = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinassocontroller.prelogincallback&su=&rsakt=mod&client=ssologin.js(v1.4.11)&_=1379834957683"
        self.loginurl = "http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)"
        self.postheader = {'user-agent': 'mozilla/5.0 (windows nt 6.1; rv:24.0) gecko/20100101 firefox/24.0'}

初始化函数,定义了两个关键的url成员:self.serverurl用于登陆的第一步(获取servertime、nonce等),这里的第一步实质包含了解析新浪微博的登录过程的1和2;self.loginurl用于第二步(加密用户和密码后,post给该url,self.postheader是post的头信息),这一步对应于解析新浪微博的登录过程的3。类内函数还有3个:

复制代码 代码如下:

def login(self):
        "登陆程序" 
        self.enablecookie(self.enableproxy)#cookie或代理服务器配置

        servertime, nonce, pubkey, rsakv = self.getservertime()#登陆的第一步
        postdata = weiboencode.postencode(self.username, self.password, servertime, nonce, pubkey, rsakv)#加密用户和密码
        print "post data length:\n", len(postdata)

        req = urllib2.request(self.loginurl, postdata, self.postheader)
        print "posting request..."
        result = urllib2.urlopen(req)#登陆的第二步——解析新浪微博的登录过程中3
        text = result.read()
        try:
            loginurl = weibosearch.sredirectdata(text)#解析重定位结果
              urllib2.urlopen(loginurl)
        except:
            print 'login error!'
            return false

        print 'login sucess!'
        return true

self.enablecookie用于设置cookie及代理服务器,网络上有很多免费的代理服务器,为防止新浪封ip,可以使用。然后使登陆的第一步,访问新浪服务器得到servertime等信息,然后利用这些信息加密用户名和密码,构建post请求;执行第二步,向self.loginurl发送用户和密码,得到重定位信息后,解析得到最终跳转到的url,打开该url后,服务器自动将用户登陆信息写入cookie,登陆成功。

复制代码 代码如下:

def enablecookie(self, enableproxy):
    "enable cookie & proxy (if needed)."

    cookiejar = cookielib.lwpcookiejar()#建立cookie
    cookie_support = urllib2.httpcookieprocessor(cookiejar)

    if enableproxy:
        proxy_support = urllib2.proxyhandler({'http':'http://xxxxx.pac'})#使用代理
         opener = urllib2.build_opener(proxy_support, cookie_support, urllib2.httphandler)
        print "proxy enabled"
    else:
        opener = urllib2.build_opener(cookie_support, urllib2.httphandler)

    urllib2.install_opener(opener)#构建cookie对应的opener

enablecookie函数比较简单

复制代码 代码如下:

def getservertime(self):
    "get server time and nonce, which are used to encode the password"

    print "getting server time and nonce..."
    serverdata = urllib2.urlopen(self.serverurl).read()#得到网页内容
     print serverdata

    try:
        servertime, nonce, pubkey, rsakv = weibosearch.sserverdata(serverdata)#解析得到servertime,nonce等
         return servertime, nonce, pubkey, rsakv
    except:
        print 'get server time & nonce error!'
        return none

weibosearch文件中的函数主要用于解析从服务器得到的数据,比较简单。

3、sserverdata函数(weibosearch.py):

复制代码 代码如下:

import re
import json

def sserverdata(serverdata):
    "search the server time & nonce from server data"

    p = re.compile('\((.*)\)')
    jsondata = p.search(serverdata).group(1)
    data = json.loads(jsondata)
    servertime = str(data['servertime'])
    nonce = data['nonce']
    pubkey = data['pubkey']#
    rsakv = data['rsakv']#
    print "server time is:", servertime
    print "nonce is:", nonce
    return servertime, nonce, pubkey, rsakv

解析过程主要使用了正则表达式和json,这部分比较容易理解。另外login中解析重定位结果部分函数也在这个文件中如下:

复制代码 代码如下:

def sredirectdata(text):
    p = re.compile('location\.replace\([\'"](.*?)[\'"]\)')
    loginurl = p.search(text).group(1)
    print 'loginurl:',loginurl
    return loginurl

4、从第一步到第二步要对用户和密码进行加密,编码操作(weiboencode.py)

复制代码 代码如下:

import urllib
import base64
import rsa
import binascii

def postencode(username, password, servertime, nonce, pubkey, rsakv):
    "used to generate post data"

    encodedusername = getusername(username)#用户名使用base64加密
     encodedpassword = get_pwd(password, servertime, nonce, pubkey)#目前密码采用rsa加密
     postpara = {
        'entry': 'weibo',
        'gateway': '1',
        'from': '',
        'savestate': '7',
        'userticket': '1',
        'ssosimplelogin': '1',
        'vsnf': '1',
        'vsnval': '',
        'su': encodedusername,
        'service': 'miniblog',
        'servertime': servertime,
        'nonce': nonce,
        'pwencode': 'rsa2',
        'sp': encodedpassword,
        'encoding': 'utf-8',
        'prelt': '115',
        'rsakv': rsakv,    
        'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinassocontroller.feedbackurlcallback',
        'returntype': 'meta'
    }
    postdata = urllib.urlencode(postpara)#网络编码
    return postdata

postencode函数构建post的消息体,要求构建得到内容与真正登陆所需的信息相同。难点在用户名和密码的加密方式:

复制代码 代码如下:

def getusername(username):
    "used to encode user name"

    usernametemp = urllib.quote(username)
    usernameencoded = base64.encodestring(usernametemp)[:-1]
    return usernameencoded


def get_pwd(password, servertime, nonce, pubkey):
    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进制。
    return passwd

新浪登录过程,密码的加密方式原来是sha1,现在变为了rsa,以后可能还会变化,但是各种加密算法在python中都有对应的实现,只要发现它的加密方式(),程序比较易于实现。

到这里,python模拟登陆新浪微博就成功了,运行输出:

复制代码 代码如下:

loginurl: http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinassocontroller.feedbackurlcallback&ssosavestate=1390390056&ticket=st-mzq4nzq5ntyyma==-1387798056-xd-284624bfc19fe242bbae2c39fb3a8ca8&retcode=0
login sucess!

果需要爬取微博中的信息,接下来只需要在main函数后添加爬取、解析模块就可以了,比如读取某微博网页的内容:

复制代码 代码如下:

htmlcontent = urllib2.urlopen(myurl).read()#得到myurl网页的所有内容(html)

大家可以根据不同的需求设计不同的爬虫模块了,模拟登陆的代码放在这里。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网