闲来无事,由于校园内网络是限流量的,查询流量很是频繁,于是萌生了写一个本地脚本进行一键查询自己的剩余流量。

整个部分可以分为三个过程进行:

  1. 对登陆时http协议进行分析
  2. 利用python进行相关的模拟登陆
  3. 后期整合

第一部分:对登陆时http协议进行分析

  模拟浏览器进行登陆,那么就需要知道当浏览器进行登陆时发生了什么事情。对此可以参见下面这张自制的图,它展示了一次浏览器访问一个地址的全过程。

  

图1 浏览器在地址框输入一个地址后发生的事情

  参考自:http://www.linux178.com/web/httprequest.html

  对于本部分来说,我们只需要关系途中的3和4过程,即http协议请求及服务器响应http协议请求返回html文件。

  由图可知,http协议请求分为三部分:起始行,头部,主体。既然我们是模拟浏览器登陆进行,那么浏览器的这些信息是怎么填的呢?这个可以通过浏览器自带的开发者工具看到,我所使用的浏览器是chorm,通过点击右上角的按钮,然后“更多工具——开发者工具”,之后选择其中的Network选项,效果如下图所示

图2 浏览器的开发者工具

  将上面的内容清空后,输入能够登录查询的网址。具体例子是我们学校为http://zyzfw.xidian.edu.cn/ 详情见图3

  

图3 查询http协议信息

 之后就可以看见协议中相关部分所填内容。但这并非我们所要的东西,我们所需要的是模拟登陆的过程,也就是说需要的是在我们填好账号密码验证码后点击登陆所发生的动作。因此应该去找点击登陆后所发出的请求内容是什么(在这里可以通过输入错误的密码来查看所发出的内容是什么,以免页面跳转后突然弹出大量的通信将我们所需要的信息淹没),头部信息如图4

图4 头部信息

  其中具体每一项什么作用可以参考这两个文章,讲的很细致很有条理

  https://www.zybuluo.com/yangfch3/note/167490

  http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

  我们模拟登陆所需要的为图4中的Host Referer User-Agent 以及图5中的数据主体

图5 数据主体

  当我们把这些信息都搞到手后,就可以开始模拟浏览器登陆过程了。

  整理一下,在本网站登陆所用的请求方法为“POST” 其采用的简单安全措施为__crsf 与验证码 因此下一步的主要工作就是讲验证码与__crsf问题搞定

第二部分:利用python进行模拟登陆

  此部分参考:https://github.com/xchaoinfo/fuck-login/blob/master/001%20zhihu/zhihu.py

  首先,构造头部信息(最好在字符串前加上r,防止某些转义问题)

url_login=r'http://zyzfw.xidian.edu.cn/'
postdata={'LoginForm[username]':'1503*****','LoginForm[password]':'*****'}
agent=r'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
headers = {
"Host": "zyzfw.xidian.edu.cn",
"Referer": r"http://zyzfw.xidian.edu.cn/",
'User-Agent': agent
}

  由于有验证码的存在,因此需要将验证码得到,具体如下:

def get_captcha():
t = str(int(time.time() * 1000))
captcha_url = 'http://zyzfw.xidian.edu.cn/site/captcha?refresh=1&_=' + t
r = session.get(captcha_url, headers=headers)
#两层get
tem=r.json()['url']
captcha_url='http://zyzfw.xidian.edu.cn'+tem
r=session.get(captcha_url,headers=headers)
with open('captcha.jpg', 'wb') as f:
f.write(r.content)
f.close()
# 用pillow 的 Image 显示验证码
# 如果没有安装 pillow 到源代码所在的目录去找到验证码然后手动输入
try:
im = Image.open('captcha.jpg')
im.show()
im.close()
except:
print(u'请到 %s 目录找到captcha.jpg 手动输入' % os.path.abspath('captcha.jpg'))
captcha = input("please input the captcha\n>")
return captcha

  其中的那个验证码的地址,通过和第一部分同样的方法,找到其获取验证码的地址(我测试的几个网站验证码获取地址都和时间有关),将验证码图片下载保存下来后就可以进行验证码的读取工作。

  只有在进行__xsrf参数的获取,过程类似,如下:

def get_csrf():
'''_csrf 是一个动态变化的参数'''
index_url = 'http://zyzfw.xidian.edu.cn'
# 获取登录时需要用到的_xsrf
index_page = session.get(index_url, headers=headers)
html = index_page.text
pattern = r'name="_csrf" value="(.*?)"'
# 这里的_xsrf 返回的是一个list
_xsrf = re.findall(pattern, html)
return _xsrf[0]

  其中涉及到简单的字符串匹配,使用简单的正则匹配就可以提取出相应的数据。

  至此,我们完成了该数据准备工作,,下一步就是开始模拟登陆,如下:

postdata['_csrf']=get_csrf()
postdata['LoginForm[verifyCode]']=get_captcha()
result=session.post(url_login,data=postdata,headers=headers)

第三部分:后期处理

  html拿到手之后,剩下的就是进行对html解析,将自己需要的信息通过正则匹配拿出来就行。

  之后在写一个批处理,做到一键查询的功能,效果如下:

  

至此,最终完成了一个简易版的一键流量查询。

展望:此程序由于没有进行自动的验证码识别,所以输入验证码是一大瑕疵,如果能够做到自动识别验证码,那么将是真正的一键查询,下一步主要就此问题进行解决。

  

pytho简单爬虫_模拟登陆西电流量查询_实现一键查询自己的校园网流量的更多相关文章

  1. phpSpider 单页测试_模拟登陆

    <?php require './vendor/autoload.php'; use phpspider\core\phpspider; use phpspider\core\requests; ...

  2. python爬虫学习(3)_模拟登陆

    1.登陆超星慕课,chrome抓包,模拟header,提取表单隐藏元素构成params. 主要是验证码图片地址,在js中发现由js->new Date().getTime()时间戳动态生成url ...

  3. 爬虫——cookie模拟登陆

    cookie适用于抓取需要登录才能访问的页面网站 cookie和session机制 http协议为无连接协议,cookie: 存放在客户端浏览器,session: 存放在Web服务器 人人网登录案例 ...

  4. 爬虫必知必会(4)_异步协程-selenium_模拟登陆

    一.单线程+多任务异步协程(推荐) 协程:对象.可以把协程当做是一个特殊的函数.如果一个函数的定义被async关键字所修饰.该特殊的函数被调用后函数内部的程序语句不会被立即执行,而是会返回一个协程对象 ...

  5. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  6. python爬虫 模拟登陆校园网-初级

    最近跟同学学习爬虫的时候看到网上有个帖子,好像是山大校园网不稳定,用py做了个模拟登陆很有趣,于是我走上了一条不归路..... 先上一张校园网截图 首先弄清一下模拟登陆的原理: 1:服务器判定浏览器登 ...

  7. 【小白学爬虫连载(10)】–如何用Python实现模拟登陆网站

    Python如何实现模拟登陆爬取Python实现模拟登陆的方式简单来说有三种:一.采用post请求提交表单的方式实现.二.利用浏览器登陆网站记录登陆成功后的cookies,采用get的请求方式,传入c ...

  8. 模拟登陆CSDN——就是这么简单

    工具介绍 本篇文章主要是解说怎样模拟登陆CSDN.使用的工具是HttpClient+Jsoup 当中HttpClient主要是负责发送请求,而Jsoup主要是解析HTML 你可能对HttpClient ...

  9. 爬虫之 cookie , 验证码,模拟登陆,线程

    需求文档的定制 糗事百科的段子内容和作者(xpath的管道符)名称进行爬取,然后存储到mysql中or文本 http://sc.chinaz.com/jianli/free.html爬取简历模板 HT ...

随机推荐

  1. html在一个页面显示另一个页面的部分内容

    老板今天让在网站上面显示实时监控画面,研究了一早,找了个简单的方法 先把监控分享在网上(我使用的海康威视摄像头,分享到萤石直播http://square.ys7.com/square/index.js ...

  2. (原创)Xilinx的ISE生成模块ngc网表文件

    ISE中,右击“Synthesize”,选中“Process Properties”,将“Xilinx Specific Options:-iobuf”的对勾取消. 将取消模块的ioBuff,因为模块 ...

  3. springMvc 使用ajax上传文件,返回获取的文件数据 附Struts2文件上传

    总结一下 springMvc使用ajax文件上传 首先说明一下,以下代码所解决的问题 :前端通过input file 标签获取文件,通过ajax与后端交互,后端获取文件,读取excel文件内容,返回e ...

  4. 把excel导入的自定义时间改成yyyyMMdd

    public static String changeCellToString(XSSFCell cell){ String result = "";// Object value ...

  5. JSONObject,JSONArray,Map,String之间转换

    http://blog.csdn.net/superit401/article/details/51727739 1.String转JSONObject String jsonMessage = &q ...

  6. C#: DataBase

    using System.Data.SqlClient; namespace WindowsFormsApplication1{ class DB { private SqlConnection co ...

  7. 解决jquery操作checkbox全选全不选无法勾选问题

    最近在学习中使用jquery操作checkbox,使用下面方法进行全选.反选:$("input[name='checkbox']").attr("checked" ...

  8. virtualbox虚拟机中的centos与macos共享文件夹

    开发中需要用到linux环境,所以使用共享模式开发.通过samba服务器来实现. 环境: 虚拟机 virtualbox 虚拟系统 centos 6.6 本机 macos  192.168.1.102 ...

  9. vue 2.0

    vue2.0 据说也出了很久了,博主终于操了一次实刀. 整体项目采用  vue +  vue-router +  vuex (传说中的vue 全家桶 ),构建工具使用尤大大推出的vue-cli 项目是 ...

  10. 机器学习之KNN算法思想及其实现

    从一个例子来直观感受KNN思想 如下图 , 绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形 ...