要进行模拟登陆,那么我们首先要了解下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文件对象
以上就是一个简单的模拟登陆的详细过程,还有更复杂的,比如验证码什么的,以后会给大家慢慢分享。