【Python3爬虫】最新的模拟登录新浪微博教程
一、写在前面
首先呢,由于之前重装系统,又要重新配置环境,然后还有一些别的事,导致我一直没有写爬虫了,不过现在又可以继续写了。
然后我这次说的模拟登录新浪微博呢,不是使用Selenium模拟浏览器操作,毕竟Selenium的效率是真的有些低,所以我选择用Python发送请求实现模拟登录,整个过程还算是有点小曲折吧。
二、开发环境
Windows10 + Python3.7 + Pycharm + Fiddler
三、页面分析
首先打开新浪微博,网址为:https://weibo.com/,这里我们只需要关注登录这一部分,如下图:
这样看是看不出来东西的,打开开发者工具,刷新一下页面,找找看有没有什么可疑的东西,然后就能找到下面这个包:
看到prelogin就能猜到应该是和登录有关的了,于是点击“Preview”查看具体内容:
到这里还是什么都看不出来,也不知道这些数据有什么用。这时候Fiddler就能派上用场了,首先打开Fiddler,然后在网页上输入用户名和密码并登录新浪微博,登录成功之后在Fiddler中找寻相关信息,可以找到下面这个url:
https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)
点开之后可以看到携带了很多参数:
在这些参数中,我们需要关注的参数为:su,sp,servertime,nonce,pubkey,rsakv。其中su是用户名加密后的结果,sp是密码加密后的结果,servertime是一个时间戳,而剩余三个参数都来源于我们前面找到的prelogin.php。那么现在的问题就在于用户名和密码是怎么加密的?
小编给大家推荐一个学习氛围超好的地方,python交流企鹅裙:【611+530+101】适合在校大学生,小白,想转行,想通过这个找工作的加入。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程
四、加密规则
首先还是找到prelogin.php,在它携带的参数中看到有一个ssologin.js,猜测它可能和加密规则有关系,所以找一下这个ssologin.js。
这里需要打开新浪的登录页面:https://login.sina.com.cn/,然后右键查看源码,再搜索“ssologin.js”,就能找到这个js文件了:
https://passport.sinaimg.cn/js/sso/ssologin.js
打开之后搜索“username”,就能找到加密规则了,如下图(红框框出来的分别是用户名加密规则和密码加密规则):
用户名的加密是很简单的,使用base64加密就行了。但是对于密码的加密有一些复杂,虽然有if和else,但其实这里我们只需要看if部分:
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)
密码的加密过程为:首先创建一个rsa公钥,公钥的两个参数都是固定值,第一个参数是prelogin.php中的pubkey,第二个参数是加密的ssologin.js文件中指定的10001,这两个值需要先从16进制转换成10进制,其中10001转成十进制为65537。最后再加入servertime时间戳和nonce字段,以及一个“\t”和一个"\n"进行进一步加密。
五、主要代码
由于使用了rsa加密,所以需要使用导入rsa模块,没有安装的可以使用pip install rsa进行安装。
这里主要说一下加密用户名和密码部分的代码:
# Base64加密用户名
def encode_username(usr):
return base64.b64encode(usr.encode('utf-8'))[:-1]
需要注意的是要使用base64加密,需要先转换成字节型数据,而且加密之后末尾会多一个"\n",因此需要用[:-1]来去掉多余字符。
# RSA加密密码
def encode_password(code_str):
pub_key = rsa.PublicKey(int(pubkey, 16), 65537)
crypto = rsa.encrypt(code_str.encode('utf8'), pub_key)
return binascii.b2a_hex(crypto) # 转换成16进制
在加密密码的时候传入的这个code_str参数就是servertime + '\t' + nonce + '\n' + password得到的结果,而在整个加密过程完成之后要转换成16进制再返回。
但是做了这两步之后并没有真的登录微博,还需要提取链接并进行跳转,不过对于我们来说做到这一步就已经够了,我们只需要保存此时的Cookie就行了,为了验证这个Cookie是否有效,我还写了一段代码进行测试,这里就不放出来了。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java问题汇总,持续更新到GitHub
目录介绍 00.Java问题汇总 01.具体问题 好消息 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢! 链接地址:https://github.com/yangchong211/YCBlogs 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变! 00.Java问题汇总 01.Java基础问题(19个) 02.Java面向对象问题(10个) 03.Java数据结构问题(20个) 04.JavaIO流问题(6个) 05.java多线程问题(19) 06.Java虚拟机问题(10个) 07.Java类加载问题(8个) 08.Java反射问题(6个) 10.Java异常问题(9个) 01.具体问题 1.1 01.Java基础部分问题(19个) 1.0.0...
- 下一篇
说说我为什么看好Spring Cloud Alibaba
最近对《Spring Cloud Alibaba基础教程》系列的催更比较多,说一下最近的近况:因为打算Spring Boot 2.x一起更新。所以一直在改博客Spring Boot专题页和Git仓库的组织。由于前端技术太过蹩脚,花了不少时间。大家不用担心,这个系列不会太监,因为我真心看好这个套件的未来,后续的更新也会继续赶上来。 今天就水更一篇吧,跟大家聊一下平时被问的比较多的一类问题,Spring Cloud Alibaba是什么,我为什么要写Spring Cloud Alibaba基础教程? Spring Cloud Alibaba是什么 简介 Spring Cloud Alibaba从名字上看,就知道一定跟Spring Cloud有关,但是我们为什么在Spring Cloud官方文档中看不到它的影子呢?因为它目前还是一个孵化项目,它
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果