您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

5b51 2022/1/14 8:18:19 python 字数 11173 阅读 355 来源 www.jb51.cc/python

1、主函数(WeiboMain.py): 复制代码代码如下:importurllib2importcookielib importWeiboEncodeimportWeiboSearch

概述

1、主函数(WeiboMain.py):

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):

        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个:

        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,登陆成功。

    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函数比较简单

    try:
        serverTime,rsakv = WeiboSearch.sServerData(serverData)#解析得到serverTime,nonce等
         return serverTime,rsakv
    except:
        print 'Get server time & nonce error!'
        return None

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

3、sServerData函数(WeiboSearch.py):

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,rsakv

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

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

def PostEncode(userName,passWord,rsakv):
    "Used to generate POST data"

    encodedUserName = GetUserName(userName)#用户名使用base64加密
     encodedPassWord = get_pwd(passWord,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 get_pwd(password,servertime,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模拟登陆新浪微博就成功了,运行输出

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

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

总结

以上是编程之家为你收集整理的python模拟新浪微博登陆功能(新浪微博爬虫)全部内容,希望文章能够帮你解决python模拟新浪微博登陆功能(新浪微博爬虫)所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶