Python爬虫-百度模拟登陆(二)

上一篇-Python爬虫-百度模拟登陆(一)
接上一篇的继续html

参数 codestring

codestring jxG9506c1811b44e2fd0220153643013f7e6b1898075a047bbd

套路我相信不少人已经掌握了,先在Charles中搜索值
python

参数值都看到了,token、tt、dv、callback这些变化的参数咱们都知道了吧,其余的参数固定,别问我为何。这个logincheck注意到了吗?是否是有人能想起前面的?不能放在字典里赋空值,要直接写在url后面,好了轻松搞定codestring。chrome

参数 verifycode

verifycode 又把

验证码就不用全量搜索了,图片嘛,浏览一下图片请求就知道了

参数是codestring不用我提醒了吧,请求一下手动输入哦,有的人问为何不搞自动识别的,其实没有必要,如今打码平台很便宜,并且大部分验证码均可以搞定,若是本身去搞得话,太费时间识别率还低,因此我这里就不说验证码这个了,若是有时间之后单独写一篇吧。缓存

参数 traceid

traceid EA43E001

老套路先搜索值,没搜到!!!,换name试试
微信


搜了不少发现都是这个createTraceID函数建立的
cookie


都找到了,本身翻译一下吧app

参数 ppui_logintime

ppui_logintime 19863

又是个时间,直接搜name吧
函数


只搜到这一个,而后搜一下timespan

当前时间减去一个初始时间,这是一个时间段,应该是从某次请求开始到某次请求结束,对于这种咱们捏造一个吧,不必那么精确,看一下大概的时间,取15000~30000吧学习

参数 rsakey

rsakey 3kUWNJ6tggVCigi7EoQZcsuKpBcDKPKj

搜一下值
ui


须要的参数不说了哦,这回看看返回值,pubkey、key,这个key的值就是咱们的rsakey,pubkey咱们后面会用到,先记下

fp_info&fp_uid

fp_uid 19ec2fa82bec175d9628b81d9683e9d2
fp_info 0245fc9782abae99a665854526e19a19002~~~nIpK32ZQH2~fI2i_lnn9ypKA34B...

这两个参数放在一块儿说,注意fp_uid和fp_info前面的是同样的,从002开始不同了

先搜了fp_uid,发现是获取cookie的,又没有搜到set cookie的地方,那么有多是经过本地生成的,对于本地生成的,其实最简单就是固定值,我也是使用固定值试了试,没有问题,固然是调试了一番之后才这么作的,由于调试太麻烦了。再搜一下fp_info看看吧

这个就可能性比较大了,开始调试了,打开chrome->隐身模式->清理缓存->打开百度首页->点击一下登陆按钮,找到刚才的js文件,搜
~

而后再清理缓存,从新刷新百度首页,点击登陆按钮

打印一下n和t的值


开始调试,进入到这个函数之后,咱们看到这里有几个函数d.genGUID,打印一下看看

是否是有点fp_uid的样子了,那就它了,这是哪一个函数呢,很简单,打印一下


翻译成python或者用python执行js脚本的方式都行,fp_uid干掉了吧,fp_info后半部分太麻烦了,有谁搞定了麻烦告诉我一声。我这里就用固定值了。

参数password

password ai2s9z7UUf9XFguwg6EUslu607/CNrit0B3c4mGF/VzEIjc+SkFM7kuSRx2LWkTAk0lecetCIQcpZ9xKtXdKy3NG7aJfkFbWxMFqCNtM3birZbkgQw6l7UKGYpeuIDAn0ae/52nU4HkcSmPAL8iGV7hQP9CxoWYpL59r8Vq8dug=

搜一下password=


断点打好了就开始调试吧,完犊子了今天死活调试不到断点处了,其实这个比较明显的,固然若是你对rsa加密不了解或者了解的很少那就不容易了,首先想一想咱们前面获取的pubkey的值,-----BEGIN PUBLIC KEY-----......-----END PUBLIC KEY-----\n,我先贴一下代码吧

def encript_password(self, password, pubkey):
        pub = rsa.PublicKey.load_pkcs1_openssl_pem(pubkey.encode('utf-8'))
        encript_passwd = rsa.encrypt(password.encode('utf-8'), pub)
        return base64.b64encode(encript_passwd).decode('utf-8')

看一下这个load_pkcs1_openssl_pem函数

def load_pkcs1_openssl_pem(cls, keyfile):
        """Loads a PKCS#1.5 PEM-encoded public key file from OpenSSL.

        These files can be recognised in that they start with BEGIN PUBLIC KEY
        rather than BEGIN RSA PUBLIC KEY.

        The contents of the file before the "-----BEGIN PUBLIC KEY-----" and
        after the "-----END PUBLIC KEY-----" lines is ignored.

        :param keyfile: contents of a PEM-encoded file that contains the public
            key, from OpenSSL.
        :return: a PublicKey object
        """

        der = rsa.pem.load_pem(keyfile, 'PUBLIC KEY')
        return cls.load_pkcs1_openssl_der(der)

若是js能够调试进去_SBCtoDBC,你就会发现它对BEGIN和END的处理,那实际上它就是在作rsa加密,因此说若是你了解rsa的这种加密方式,看到BEGIN PUBLIC KEY和END PUBLIC KEY的时候就立刻能猜出来了,因此加密函数已经给你了,pubkey获取了,password你本身知道,那这个也搞定了。

至此,登陆参数都搞定了,咱们能够向下进行了

请求的url和参数都在登陆的返回值里,解析一下https://www.baidu.com/cache/user/html/v3Jump.html?err_no=0&callback=parent.bd__pcbs__psvho&codeString=&userName=wuqing198985&phoneNumber=&mail=&hao123Param=RmxaRU5VTVcxTVNWcDFiMDlEU3psMWFVeGtaa2c0TldOSk0yVk1WVFV0WWxCcmVuUmxWSEl0VWpsaVl6bGhRVUZCUVVGQkpDUUFBQUFBQUFBQUFBRUFBQUNzdWQwS2QzVnhhVzVuTVRrNE9UZzFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFIM2dwMXA5NEtkYVJG&u=https://www.baidu.com/&tpl=mn&secstate=&gotourl=&authtoken=&loginproxy=&resetpwd=&vcodetype=&lstr=&ltoken=&bckv=1&bcsync=KnqkeCS8J7B9vuKnaRltPTrp9Kl0hPsH6votXG00OmsypOV8lYboSn7pxuyb%2F1l8XUlp9M0v0gIKoL9og3nXmZYFaGCcMO%2Fx4roGpF7SFA0cqXGlnhwGeBmIY5cVxgeM6aJ2RjPXp3fb6q41WjTiipEvOXCvcfuW7XLemxoEv%2F2ribszd6n7ql7aO7l850fOFqzBiZGeBNu3D0OZFnJeSsOHMEquD6Ahw9dbRl9ahaaRSEMDxQtrn36Bj2jayIY88OTyu7CWjtApT2eZ2SfAjBhr3IzHbnbSPhtoL82nsH7WwqHGeqq3uxYDdqH7ZkgjE3JlQV9SDQCPTnfpPxIrYg%3D%3D&bcchecksum=2590966377&code=&bdToken=&realnameswitch=&setpwdswitch=&bctime=1520951421&bdstoken=&authsid=&jumpset=&appealurl=&realnameverifyemail=0&traceid=&realnameauthsid=&accounts=
请求完之后,返回值里没有什么明显的有用值,那我就直接访问了一下首页

咱们怎么断定登陆成功呢,通常就是获取有用户名的页面,而后获取一下用户名,看是否存在,若是有那么就登陆成功了。很幸运访问首页后登陆成功了。百度模拟登陆到这里就结束了。以前微博模拟登陆的时候,访问一个页面,返回值里是下一个页面连接,再访问再返回下一个。咱们在处理这种的时候呢,咱们要怎么处理呢?

逆向推理:首先找咱们须要的目标点,好比一开始我就找登陆请求,而后看登陆请求里面须要哪些参数,而后再一步步分析这些参数的来源,其实就是逆向推,另外登陆请求完成后,再找一个目标点,就是已登陆的页面,若是没有成功,就从登陆往下看。基本就是这么一个思路。


最后要再说一下,写这个的目的并非为了什么项目之类的,就是学习,练习一下,因此你们就不要吹毛求疵了,并且我也不接受吐槽。其余文章能够查看个人简书呦。简书-星星在线


若是你以为个人文章还能够,能够关注个人微信公众号:Python爬虫实战之路
也能够扫描下面二维码,添加个人微信号
公众号

微信号

相关文章
相关标签/搜索