深入分析微博密码加密and百万级数据采集分享(登录篇)
一、前言
- 此文章主要是对微博微博关键词的检索结果进行采集,但是微博的采集需要登陆,所以此程序分为登陆程序和爬虫程序两部分;
- 微博要实现规模性数据采集自然少不了大量账号,这就需购买大量账号以及批量登陆,但是都买的账号都会对IP进行限制(一个ip下面最多登陆两个账号),所以无法实现批量登录,只能将采集程序与登录程序以1:1的形式部署多个节点,通过调用关键词任务分发接口来实现大量采集;
- 微博的关键词采集可以在weibo.com以及weibo.cn两个站点进行采集,这里主要针对weibo.com进行采集;
- 这篇文章复制的是我在csdn上的文章,原文链接为:https://blog.csdn.net/qq_38742052/article/details/103416912
二、登陆
登陆主要分为两种方式:selenium+chrome以及模拟登陆
- selenium+chrome:这个方法比较简单,直接控制浏览器登陆就行,登陆可能会出现验证码,验证码是最普通的那种,直接调用打码平台即可;
- 模拟登陆:模拟登录比较麻烦,这一块会详细说,微博的登录为RSA加密登录,RSA加密原理大家可以自己百度下,这里就不赘述了,登录分为两部分,首先为预登陆,会返回加密公钥以及其他一些必要的参数,第二步把这些参数+加密通过RSA加密,公钥,验证码(如果有)请求登录链接即可成功
首先预登录,一般会在输入账号以后会触发此请求,也可能会在点击登录后触发
主要参数:

其中su为账号的base64加密,_为当前时间戳,其他参数为固定值
返回值:返回值分两种情况,一种有验证码,一种无验证码,当需要输入验证码时会返回pcid字段,不需要输入时不会返回,结果如下图

有用的几个参数为servertime,nonce,pubkey,rsakv,pcid(如果有)。
接下来为获取验证码,验证码链接为:"https://login.sina.com.cn/cgi/pin.php?r=86006630&s=0&p="+pcid,参数r随意,p为pcid,请求时请求头加上UA和refere,返回验证码后代用打码平台来识别验证码
最后开始重头戏,密码加密部分,首先输入账号和密码登录一次,点击登录之前先打开浏览器控制台清空所有请求,接下来观察登录过程所出发的请求
很明显,第二个请求为登录触发的js,把鼠标放在Initiator对应的位置就会出现这个 JS文件包含的方法和对应的路径,请求表单里面包含的参数su、nonce、rsakv与上面提到的是一致的(我的不一致时因为我两次登陆使用的不是同一个账号),sp为rsa加密后的结果,然后去sources里面找到对应路径下面的js文件,在里面搜一下这几个参数。
784行这里这几个参数都出现了,而且782行是用户名的base64加密,在这里打上断点,一步步调试提取出加密js,调试的过程比较繁琐,需要耐心;还有个比较快的方法是直接用这个js文件,使用里面的sinaSSOEncoder对象进行加密,不过最后在代码中执行js文件时还是要吧里面一些没用的东西删除掉比如windows,alert等,785-790行为加密需要的一些参数,都是预登录得到的,需要注意的是servertime也是预登录返回的servertime不是当前时间,第791行的b就是加密后得到的结果,即第二步请求sp参数。
至此,所有登录需要的参数都已经得到了,带上所有参数请求(post)这个链接https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)获取返回的cookie就能直接登录了。
登录代码git地址:https://github.com/JetLei/MblogLoginDemo。
下一篇将是微博百万数据采集架构的流程分享。
深入分析微博密码加密and百万级数据采集分享(登录篇)的更多相关文章
- laravel更改默认的登录密码加密方式
laravel更改默认的登录密码加密方式 laravel 默认用的登录密码加密方式是: $password = Hash::make('password'); 而我平时用的密码加密方式是: $pa ...
- 【RPA之家转载】苏桦 华为RPA 企业财务实践:RPA与AI结合,实现百万级票据、合同处理自动化
[RPA之家转载]苏桦 华为RPA 企业财务实践:RPA与AI结合,实现百万级票据.合同处理自动化 看到大会的主题,说每一位开发者都了不起,说白了我也非常的感触,因为我自己本身也是一个开发者,我从01 ...
- 总结:如何使用redis缓存加索引处理数据库百万级并发
前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1000万条数据,可以参考我之前的文章插入数据, ...
- Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- Netty_Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- 【netty】Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- 使用bcrypt进行用户密码加密的简单实现
Bcrypt百度百科: bcrypt,是一个跨平台的文件加密工具.由它加密的文件可在所有支持的操作系统和处理器上进行转移.它的口令必须是8至56个字符,并将在内部被转化为448位的密钥. 除了对您的数 ...
- 使用redis缓存加索引处理数据库百万级并发
使用redis缓存加索引处理数据库百万级并发 前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1 ...
- [NewLife.XCode]实体列表缓存(最土的方法实现百万级性能)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
随机推荐
- Solaris 11中配置基于link的IPMP
http://blog.itpub.net/29960937/viewspace-1347901/ Tips: Record and feedback errors you have encounte ...
- HashMap的底层实现以及解决hash值冲突的方式
class HashMap<K,V> extends AbstractMap<K,V> HashMap put() HashMap get() 1.put() HashMa ...
- Vue全局混入
混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 数据对象合并 数据对象在 ...
- ES6---new Promise()讲解(尤其注意里面的参数resolve、reject)
直接打印出来看看吧,console.dir(Promise). 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.cat ...
- JUnit——assertThat(acture,matcher)
使用hamcrest之前需要引入相关的jar包,包括hamcrest-core.1.3.jar和hamcrest-library-1.3.jar. 具体引入的方法为:右击JUnit工程——build ...
- pd.read_csv参数解析
对pd.read_csv参数做如下解释: pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', n ...
- sh_05_函数的参数
sh_05_函数的参数 def sum_2_num(num1, num2): """对两个数字的求和""" # num1 = 10 # nu ...
- LVM逻辑卷的扩充
LVM 的全名是 Logical Volume Manager,中文可以翻译作逻辑滚动条管理员.之所以称为”滚动条”可能是因为可以将 filesystem 像滚动条一样伸长或缩短.LVM 的作法是将几 ...
- logstash之OutPut插件
output插件是经过了input,然后过滤结构化数据之后,接下来我们需要借助output传到我们想传到的地方.output相当于一个输出管道. 2.3.1: 将采集数据标准输出到控制台 配置示例: ...
- wannalfy 挑战赛8 F 白云的树(树形dp)
链接:https://www.nowcoder.com/acm/contest/57/F 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64b ...