python模拟登录并且保持cookie的方法详解
前言
最近在爬行nosec.org的数据,看了下需要模拟登录拿到cookie后才能访问想抓的数据,重要的是nosec.org的登录页面form中有个authenticity_token字段每次访问登录页面都会自动生成,而且会和你的用户名,密码一样被POST到服务器。
经过一番研究后发现,直接访问网站登录界面的时候,服务器的响应头会有一个Set-Cookie字段,如下:
_nosec_session=ZTlHNmxuZXE4R0s1UXpsVUxGRTNPblNBWFd2TXU4TU9aNWVJM2lyLzNFY0pLeUdNMDY1cmZqanpkc0ppaGtjU i9kTGdWenBrNXJKenNqbnN2YUxucE1DRW5UMHNTR1RxWDZPeGlLazllTmY1czVpYWplazJXdWkvZS9wUHJpc1Jya3ZzcmNVMytPR it2T1dEcGx4bHNDTTVzSmVTb0xhSjRycE03QUl5RXE5Z2tZWG1mTHFBWGx1QW52QjBURi8rLS1acE8yeVRtMFRZR1JWdExneStwdmpRPT0 %3D--a6ccd9a12a8af5c8b5fb6625c24bb4db0398c503;path=/;HttpOnly
而且页面form的表单有一个authenticity_token的input,内容如下:
之前按照后端的逻辑分析_nosec_session的值经过解密以及各种xx手法得到authenticity_token的值,然后顺带着username和passwordpost就行了,最后发现这真是一个大写的傻逼!!老是用后端的思维思考问题,过不得最近走路都走不好了。所以来,直接在页面中抓取已经生成的authenticity_token的值,然后顺着POST过去就好了啊。
使用requests库的Session()方法,确实很好用,比早期直接拿cookielib就干方便多了。
代码
类XXX的login方法用来模拟登录,就贴出这部分登录的代码好了。
classXXX: deflogin(self): r=self.s.get('https://nosec.org/users/sign_in') html=r.text p1=re.compile(r'city_token"value="(.*?)"') res=re.search(p1,html) authenticity_token=str(res.group(1)) print'authenticity_token:',authenticity_token #print'cookies',self.s.cookies #prints.cookies data={ 'authenticity_token':authenticity_token, 'user[login]':'xxxxx', 'user[password]':'xxxxx' } r=self.s.post('https://nosec.org/users/sign_in',data=data) #printr.headers #printr.request.headers #printself.s.cookies print'[*]OK!' returnTrue
调用了login方法后下次直接用self.s.get()请求网页就会带着cookie啦。
之前被思路坑了一次,被笔误也坑了一次(https写成http),导致我抓狂了好久才发现这个“BUG”==、所以还得多谢代码,提高排Bug的效率2333!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。