您的位置:首页 > 编程语言 > Python开发

python简单模拟登陆详解

2016-12-30 16:41 302 查看
要进行模拟登陆,那么我们首先要了解下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文件对象


以上就是一个简单的模拟登陆的详细过程,还有更复杂的,比如验证码什么的,以后会给大家慢慢分享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 模拟登陆 url