最新requests模拟百度登录的干货

前言
百度的模拟登陆网上有很多的教程,大家可以看下.几乎所有的教程都是到error_no=0,就说已经登录成功了.关于这个问题我开始也以为是这样的,不过自己最近在一次尝试登录百度网盘的时候发现,仅仅是error_no=0,是无法登录到百度的任何产品的.很多文章误人太深

在这里就不得不说一下python requests的session了

requests的session在一定的程度上可以很好的管理cookies,但是他是不完美的,我目前使用的是Python2,很多的时候requests的session不能很好的管理登录的cookies

说一下百度网盘的登录:

正常的最后的一个post到https://passport.baidu.com/v2/api/?login发送后会返回一个js,使用正则去提取这个js中的url,再次发送,会接着返回一段js,这一段js对于使用requests的爬虫的话没有什么作用.

然后网页端网盘会跳到https://pan.baidu.com/disk/home这里,这里就会结果3次的重定向,才会到登录的home页上去,没有这一步,即使是error_no=0,也无法登录到百度的相关产品上去的

GET https://pan.baidu.com/disk/home

第一次重定向:

 url = "https://passport.baidu.com/v3/login/api/auth/"
 querystring = {"return_type": "5", "tpl": "netdisk", "u": "https://pan.baidu.com/disk/home"}

如果是默认的cookie的话,不会得到302的重定向网址,返回的结果是,页面访问错误
因为这里的一次请求使用的是一个过期的cookies,如果使用requests的session去请求,是得不到正确的跳转的,至于是哪一个cookie,大家可以自己分析,这里不表.

第二次重定向:

 https://pan.baidu.com/disk/home?errno=0&errmsg=Auth Login Sucess&stoken=6Hw4OkYaALOh2vz3GlmZ6vkmGvuq454Cyk8c2Z6Q2a2B7olL2PYw1dfz5j+7QFluhqxKLYr/NR2b7BN9so0STyJJ3fCnxoc/pLbJM8Tue1XVIgrHVMai1zdm6a9JoYBl/1Fq1xgyre+LXDYpnM+esZ2iLg/5Dg0MdnAEJfWtW3Ne2xnssdmDDogRl2ABq/Zpk6DAQX5DU7QMn9pVy/PkB1QYpe+zHfzIfQynncpeIbHpDXdHYOaxO7a59iBQI5T90XFrHf7Av6700Y7ZLjLKUqw==&bduss=&ssnerror=0&traceid= 

这一步需要手动提取出重定向的url,response.headers['Location'],url中有一个加密的stoken是服务器返回的
这一步就有点意思了,限制了带上的cookies的数量,如果带上的的cookies多了,会导致请求得不到正确的结果,在这里requests的session就有些智障了,没有关系,找到那几个cookie不难,模拟一下

最终的重定向:

https://pan.baidu.com/disk/home?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid= 

这是第三次的重定向的url,基本是最后的home页了,到了这一步才是完整的登录了百度网盘了,判断是不是登录成功的话,找一下bdstoken,任何的网盘用户有唯一bdstoken值,如果能找到说明登录成功了

结语:
很多的登录反爬会在最后的重定向上面做文章,相比的话,百度的登录还算是比较简单的,所需的参数,js加密的也不是很难,只是需要耐心的分析

猜你喜欢

转载自blog.csdn.net/wu0che28/article/details/84891924