python爬虫登录微博_[突如其来]python爬虫模拟登录微博

欸我不是明明在学unity么咋突然整了个爬虫??????

前两天一个庞友问我要不要接个爬虫的私活之类的,因为我学过一些爬虫嘛。。。但是其实我贼菜啊啥也不会那种。

不过反正这几天在家没事干,(当然了情人节肯定也没的过),就把人家给我的自测题爬微博做了一下

顺便写了一下大概步骤(万一我以后忘了还能翻回来看看😂)

然后我就把onenote的内容直接贴过来了

目标地址

https://login.sina.com.cn/signup/signin.php

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

看到请求中的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但是会封账号,要是比较狠的爬的话还是买一堆小号比较好。。。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值