美文网首页Python小推车
新浪微博爬取之模拟登录(附完整代码)

新浪微博爬取之模拟登录(附完整代码)

作者: Never肥宅 | 来源:发表于2020-02-23 00:05 被阅读0次

    新浪微博爬取之模拟登录(附完整代码)

    目标地址


    在这里插入图片描述

    随便输入一个用户名和密码(毕竟还不想真的登录进去)。

    看到请求中的prelogin

    登录的url为https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)

    在这里插入图片描述
    而另一个login中的内容是
    在这里插入图片描述
    _:里的一串数字是一样的,英国是时间戳

    上面的client里面有个ssologin.js,应该是和login登录有关的json

    在elements里面查找


    在这里插入图片描述

    打开这个网址


    在这里插入图片描述
    在之前的query string parameters里面可以找到一个参数su,在这个里面看看su被赋值成了什么

    搜索su =


    在这里插入图片描述

    request.su = sinaSSOEncoder.base64.encode(urlencode(username));

    意味就是把我们的用户名url编码后再进行base64编码即可,此处获得用户名的加密方法

    python实现的话就是

    def encode_username(usr):

        return base64.b64encode(usr.encode('utf-8'))
    
    在这里插入图片描述

    su发送的字符为MTIz


    在这里插入图片描述

    Python 实现相同的效果,验证没错

    后面一段是password的加密

    if (me.service) { request.service = me.service } if ((me.loginType & rsa) && me.servertime && sinaSSOEncoder && sinaSSOEncoder.RSAKey) { request.servertime = me.servertime; request.nonce = me.nonce; request.pwencode = "rsa2"; request.rsakv = me.rsakv; var RSAKey = new sinaSSOEncoder.RSAKey(); RSAKey.setPublic(me.rsaPubkey, "10001"); password = RSAKey.encrypt([me.servertime, me.nonce].join("\t") + "\n" + password) } else { if ((me.loginType & wsse) && me.servertime && sinaSSOEncoder && sinaSSOEncoder.hex_sha1) { request.servertime = me.servertime; request.nonce = me.nonce; request.pwencode = "wsse"; password = sinaSSOEncoder.hex_sha1("" + sinaSSOEncoder.hex_sha1(sinaSSOEncoder.hex_sha1(password)) + me.servertime + me.nonce) } } request.sp = password;

    这段看上去就很让人头大了,写了微博密码的加密过程,有rsa和wsse两个加密分支

    有大佬验证过了基本上都是走rsa分支的,另一个分支不用管(我应该直说我不会哈哈哈哈哈)

    那么我门仿造他的rsa

    import rsa

    import binascii

    def get_password(message, n):

    """RSA加密用户密码"""
    
    pub_key = rsa.PublicKey(int(n, 16), int('10001', 16))
    
    crypto = rsa.encrypt(message.encode('utf8'), pub_key)
    
    return binascii.b2a_hex(crypto)
    

    也是把"10001"加进PublicKey,然后进行encrypt,然后看下结果

    (当然了直接用json里面的对象进行加密也可以咯)

    publickey = rsa.PublicKey(int(pubkey, 16), int('10001', 16))

    message = str(servertime) + '\t' + str(nonce) + '\n' + str(password)

    sp = rsa.encrypt(message.encode(), publickey)

    res = binascii.b2a_hex(self.sp)

    需要好多username以及password之外的信息,所以还是先请求一波,获取信息。


    在这里插入图片描述

    Form data里面可以看到好多东西,加密方式也是咱们的rsa2,从刚才的加密方式可以看出需要里面的servertime,nonce,pubkey

    url = ' = self.username,tstamp = time.time() * 1000)

    try:

    res = self.session.get(url).text

    print(res)

    进行一波访问可以看到获得的内容


    在这里插入图片描述

    用正则表达式取出{}里面的内容

    res = re.findall("{.*}",res)[0]###

    用json加载,变成字典

    self.res = json.loads(res)

    这样就获得了我们需要的一些参数。其他的固定的东西直接填上就好。

    我的密码也是乱填的123

    发出的消息是

    sp:

    e3863eb0dbbf44990b95df6a4c3ff3f57f1e8185cf35d6c39c9f4c2b9bfc18ffe13545619d6520c1834b337b4f88292ff70b9a853ca6b3d2d1f0a24e74e1c85cc17c26e01ba85d9b49426542d156f0afe0e2cf01c0b4d5c3f7ba0fbb3f05ad613c97e7eac860888db17e34718d738243e6091a274e3ca445274f642bccbd2664


    在这里插入图片描述

    但是算出来结果不一样啊????

    emmm不一样是正常的毕竟加密不是简单直接把密码这个常量加密的。

    尝试一下模拟登录


    在这里插入图片描述 在这里插入图片描述

    emmm忘了改成自己微博的账号密码了,不过这说明程序可以正常运作

    在这里插入图片描述
    在这里插入图片描述

    emmm这就有点尴尬了,不过也说明正常发送了正确的用户名和密码,并被确认

    这次让他访问一次后等待10秒,再次用session访问,我趁机允许登录,但是还是显示登录失败了(不知道有没有大佬来指教一番)


    在这里插入图片描述

    于是一怒之下我放了大招:换大号微博登录!一次成功,有点开心hhhhh


    在这里插入图片描述
    登录成功了以后用session再进行访问爬取或者保存下cookie然后利用cookie爬取登录后可见的内容就阔以了。

    不过微博的爬虫虽然不封ip但是会封账号,要是比较狠的爬的话还是买一堆小号比较好。。。

    毕竟我大号微博陪我这么久我可不舍得丢

    完整代码

    import base64
    import requests
    import rsa
    import binascii
    import re
    import json
    import time
    import random
    '''用rsa对明文密码进行加密,加密规则通过阅读js代码得知'''
    class WeiBoLogIn():
        def __init__(self,username,password):
            self.username = username
            self.password = password
            self.encode_su()
            self.session = requests.session()#建立一个连续访问
            self.loginurl = 'https://login.sina.com.cn/signup/signin.php'
            self.session.get(self.loginurl)#目标登录地址
        #加密su
        def encode_su(self):
            self.su = base64.b64encode(self.username.encode('utf-8'))
    
        def pre_log(self):
            #访问一波拿到各种东西
            url = 'https://login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su={uname}&rsakt=mod&client=ssologin.js(v1.4.15)&_={tstamp}'.format(uname = self.username,tstamp = time.time() * 1000)
    
            try:
                res = self.session.get(url).text
                res = re.findall("{.*}",res)[0]###
                self.res = json.loads(res)
                #print(self.res)
                self.nonce = self.res["nonce"]
                self.pubkey = self.res["pubkey"]
                self.rsakv = self.res["rsakv"]
                self.servertime = self.res["servertime"]
    
                #self.nonce = 
            except:
                print('failed')
    
        def get_sp(self):
            publickey = rsa.PublicKey(int(self.pubkey,16),int('10001',16))
            keycode = str(self.servertime) + '\t' + str(self.nonce) + '\n' + str(self.password)
            self.sp = rsa.encrypt(keycode.encode(), publickey)
            self.spcode = binascii.b2a_hex(self.sp)
            print(self.spcode)
    
        def login(self):
            self.pre_log()
            self.get_sp()
            data = {
                'entry': 'sso',
                'gateway': '1',
                'from': 'null',
                'savestate': '30',
                'useticket': '0',
                'pagerefer': 'https://login.sina.com.cn/sso/login.php?client=ssologin.js',
                'vsnf': '1',
                'su': self.su,
                'service': 'sso',
                'servertime': self.servertime,
                'nonce': self.nonce,
                'pwencode': 'rsa2',
                'rsakv': self.rsakv,
                'sp': self.spcode, 
                'sr': '1500*1000',#分辨率吧应该是,r是resolution
                'encoding': 'UTF-8',
                'cdult': '3',
                'domain': 'sina.com.cn',
                'prelt': random.randint(1,100),
                'returntype': 'TEXT'
            }
    
            url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js'
            j_content = self.session.post(url,data=data).json()
            print(j_content)
            # time.sleep(10)
            # j_content = self.session.post(url,data=data).json()
            # print(j_content)
    
    
    weibo = WeiBoLogIn('****不给看***','*****真的不给看哦***')
    #weibo.pre_log()
    weibo.login()
    
    

    相关文章

      网友评论

        本文标题:新浪微博爬取之模拟登录(附完整代码)

        本文链接:https://www.haomeiwen.com/subject/wifrqhtx.html