社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python爬虫-百度模拟登录(一)

Python爱好者社区 • 8 年前 • 1033 次点击  

作者:星星在线    Python爱好者社区专栏作者
       简书地址:https://www.jianshu.com/u/680e0e38ddc9


前文传送门:

新浪微博PC端模拟登陆


千呼万唤shi出来呀,百度模拟登录终于要呈现在大家眼前了,最近比较忙,晚上又得早点休息,这篇文章写了好几天才完成。这个成功以后,我打算试试百度网盘的其他接口实现。看看能不能把服务器文件上传到网盘,好歹也有几T的空间。


登录百度


先清理浏览器缓存,打开Charles,登录一次百度主页,抓取到登录过程。



本来是想改一下写作的格式,美观一些,但是想了想,还是按照分析的顺序来写,这样有利于大家了解一种分析的思路。看过上一篇新浪微博PC端模拟登陆的应该知道,首先要找到登录的请求,一般为post,地址中有login



请求找到了,参数......,太TM多了。先观察一下参数,一般无序、随机、没有什么规则的参数有可能是变化参数,其他的一般都是固定参数。当然,也可以多次登录抓包,对比一下大概也能确定。那么我们确定一下变化的参数:token、tt(时间戳)、codestring、gid、password、verifycode(验证码)、rsakey、ppui_logintime、fp_uid、fp_info、dv、traceid


参数分析


确定了需要分析的参数,从哪个开始分析呢?随意吧



一般有些参数之间是有关系的,比如token的请求参数里需要gid参数



这里我就不一一去分析参数间的关系了,直接来了啊


参数 gid


一方面其他参数需要它,另外就是这个参数是完全由本地js生成的。先看一下这个参数



搜索一下这个值,没有。那么我们再来搜一下这个name,就是gid,之前说过我们一般是找xxx=这种,先来搜一下gid=



点击loginv4_9f3632a.js,然后在JavaScript页签搜索gid=



有好几个,我圈出了这个getqrcode?请求,为啥捏?看图,我们找到这个请求



看到请求里的gid值了吗?跟我们登录的gid是一样的,那就确定是这个地方了,gid=e.guideRandom,然后在这个脚本里搜一下guideRandom



然后翻译一下这个js,这......就自己去琢磨吧



参数 token


先搜索token的值



得到请求地址:https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt=1520951400830&class=login&gid=E8ED064-D480-4F3E-A5CE-BCF25F8DD1E2&loginversion=v4&logintype=dialogLogin&traceid=&callback=bd__cbs__6l1agx



就剩下callback,其他的请求里也需要callback这个



搜一下bd__cbs__,为啥要搜这个?这个真的很痛苦,callback搜出来一大片,而且没看出来什么有效数据,值又搜不到,那就搜一半吧,你问我为啥?第六感,不管你信不信,反正我是信了



其实呢,有好几个请求都有这个参数callback,然后我们观察这些callback的规律,基本就是这个bd__cbs__没变,所以可以搜一下它试试,搜到两个



分析一下这段代码,基本就是c.getUniqueId这个函数了,搜一下这个函数



oj8k,找到了,代码贴下面,为什么这么写?自己查js去,当然有更简单了pyv8或者psexecjs



Token这里我要再说一下,参数我们分析完了,你以为请求就成功了吗?



Oh!yeah,之前我们都是得到所有请求参数就访问成功了


就这里卡了我好长时间。那么碰到这种情况要从那几个点着手呢,首先我想到的是cookies



然后向上去找Set Cookie的地方



访问首页得到四个cookie值,H_PS_PSSID、BIDUPSID、PSTM、BAIDUID



这里又找到一个BDORZ,首页很简单,没有什么参数,



注意看这几个参数,就在上面四个cookies中,t是时间戳,参数都搞定了,那么Token的cookies也都搞定了,终于可以成功了,图样图森破,还是不行。MMP,cookies搞定都不行,我还有招,请求头!!!浏览器里直接拷过去,看你还想咋的



然鹅....,算你狠,不过我不会轻易认输的



调试他娘的,一遍一遍又一遍,两遍三遍四五遍,各种姿势都试了,终于高潮要来了,特么的请求不一样



先上图


浏览器的正常请求


程序发送的请求


看到不一样了吧,为什么呢?我们在用requests库的时候,get请求我比较习惯用.get(url, params=data),参数用params的方式传入,再来看一下Token请求的参数



getapi是空,那很明显

data = {  "getapi":"",  "tpl":"mn",
  ....
}
session.get(url, params=data)


然后发送的请求就是/v2/api/?getapi=&tpl=mn&....,实际上正常的请求是/v2/api/?getapi&tpl=mn&...,竟然还有这种操作,我真的是第一次碰到,改一下

data = {  "tpl":"mn",
  ...
}
url = ".../v2/api/?getapi&{}".format(urlencode(data))
session.get(url)


到这里才算OK了,最后总结了一下,请求的那个坑、请求头中的Referer、cookies,终于可以说一句OJ8K


参数 dv


为什么要先说这个dv,首先这个我没完全破解,另外就算你用固定值,也不影响结果,这个不能详细说,否则得好几帖子,我们先搜dv=



切换到javascript页签



我们可以搜一下dv_Input这个控件,它是没有的,我就不展示了,然后应该就是window.LG_DV_ARG了



这里有dvjsinput,上图我们也看到了这个,切换到javascript页签看一下



然后打开浏览器,清空缓存,打开隐身窗口,打开开发者工具,访问百度首页



观察一下dv值的特点,可以找一些比较有特色的部分搜一下,比如tk、@,这样尽量减少我们调试js的过程,因为真的很痛苦



在console里面执行一下这个计算,跟我们dv前面的值是不是类似,那就是它了,不管你是不是我都认为是。然后再搜一下@



刚才计算的Token+@+Ue(xx),这个肯定就是dv了,至于Ue嘛,我没搞定,不过发现没啥意义,写固定值也可以,也就不用费心去找这个了。





太多了,所以这里就分割一下,剩下的下一篇再继续



Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”开始学习Python课程

关注后在公众号内回复 课程即可获取

小编的Python入门视频课程!!!

崔老师爬虫实战案例免费学习视频。

丘老师数据科学入门指导免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。

丘老师Python网络爬虫实战免费学习视频。



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/RXaTeYXaPP
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/9147