python简单模拟登陆详解

要进行模拟登陆,那么我们首先要了解下http协议,这里我们简单介绍一下,方便后面的模拟登陆。

  • http协议属于应用层的面向对象协议
  • 主要功能用来传输页面,所以传输页面有他特定的规则,
  • 我们了解他的规则 实现多线程批量注册、投票、调到、发帖、都是可行的,网页除了Flash模块不能操作以外,其他Dom页面元素节点都可以操作。

url地址解析:http://host[“:”post][abs_path]

  • host是主机地址,由域名解析主机ip,所以输入域名的时候也能找到服务器
  • port是端口号,浏览器默认80端口。如:baidu.com:80
  • abs_path:是文件的路径 类似于我们访问文件夹一样

有时候我们会在后面看到’?’,问号后面有一些东西,通过’=’来传值,这个是传递给服务器的参数。比如 访问一篇文章总要知道那篇文章的ID一样 例如:

百度后面传递了id属性 值为utf-8
r https://www.baidu.com/s?ie=utf-8

url我们了解了之后,我们来说下用户[浏览器]请求服务器

  • 它的请求方式有很多比如我们经常说的get和post其他后续用不到。
  • get简单来说就是获取属性,聚义获取什么数据需要通过url和问号后面传递的参数来定
  • post也是获取数据,但是可以传递数据到服务器,比如传递账号、密码、验证码等等。
  • 两者还有不同的是:
    • get传递参数的时候是在url后面添加问号来传递,后台服务器接收。Django可以看不到问号传递参数
    • post是饮食提交给服务器,也就是说用户浏览器是看不到的,而且为了安全,有的密码还会通过js一些算法加密。

协议头(请求头)

在请求之后,会有一些特定的请求头数据,通过F12抓包功能可以查看

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Host:www.discuz.net
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36

这是一个简单的头信息,在User-Agent中可以看到有 系统版本、浏览器版本及核心,还有Accept-Encoding中后面使用的gzip请求压缩页面返回,一般写代码里会把它删掉,避免返回压缩后的网页,还要解压(有的会自动解压缩)
了解了这些,我们可以开始实战了。

分析页面

拿一个简单地网页来练手:discuz PHP开源论坛

通过谷歌浏览器,自带的F12自带的Network抓包工具进行请求抓取
POST登录的数据包:

Request URL:http://www.discuz.net/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1
Request Method:POST
Host:www.discuz.net
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:92
Origin:http://www.discuz.net
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36
Content-Type:application/x-www-form-urlencoded
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Referer:http://www.discuz.net/forum.php
Cookie:t7asq_4ad6_noticeTitle=1; t7asq_4ad6_saltkey=CfRWcRpa; t7asq_4ad6_lastvisit=1483080183; pgv_pvi=5423572800; pgv_info=ssi=s6584585800; t7asq_4ad6_sendmail=1; t7asq_4ad6_lastact=1483083785%09forum.php%09; t7asq_4ad6_connect_is_bind=0
data中的数据:
fastloginfield:username
username:xxxxxxxx
password:xxxxxxxx
quickforward:yes
handlekey:ls

中间请求头我们不用管看最后的data中的数据:
1. username 账号 我登陆前输入的账号
2. password 密码 我登陆输入的密码

POST成功返回响应头中set-cookie最后GET首页中添加这些Cookue来完成登录,我们来写入python试试

python模拟登陆__PHP开源论坛

在这里我们使用第三方模块requests
pip install requests

通过pip安装这个模块

#!/usr/bin/env python
#-*-coding:utf-8-*-
import requests

session = requests.Session() #通过这个Session课一直接传递Cookie值不需要手动取出来,get的时候再添加
url="http://www.discuz.net/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1" data={'fastloginfield':'username','username':'xxxxxxxx','password':'xxxxxxxx','handlekey':'ls'}

session.post(url,data)  #使用post请求拿到用户信息的Cookie 参数一:url是post请求的地址 参数二:是post提交的参数用的dict
res = session.get('http://www.discuz.net/forum.php')    #session中会把刚刚返回的Set-Cookie添加到GET请求头中进行访问,返回的对象用res名字来保存。
print res.content   #通过print打印 get登录之后返回的页面 登陆成功后,可以发帖、签到神马的了,模拟登陆没有神马难的,主要是我前面讲道德要了解http协议,分析网页数据包,最后需要什么参数,获取之后传递什么参数即可

为了避免卡死shell我们可以使用ipython shell来进行打印,发现还是现实不全,我们还是写到文件吧

写到文件
 f = open('d:/disccuz.txt','w') #打开一个文件如果没有使用w模式创建,如果有会被删掉重新创建
 f.write(res.content) # 写进返回的网页源码
 f.flush()# 刷新写入的数据
 f.close()# 关闭f文件对象

以上就是一个简单的模拟登陆的详细过程,还有更复杂的,比如验证码什么的,以后会给大家慢慢分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值