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

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

  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. 读文章《Flexbox详解》笔记

    文章地址:Flexbox详解 属性摘抄: flex container : display: other values | flex | inline-flex; flex-direction: ro ...

  2. iOS - WXPay 微信支付

    1.微信支付申请 微信支付官方集成指引 微信支付官方集成指导视频 微信 APP 支付开发者文档 微信公众平台 微信开放平台 微信商户平台 1.1 微信 APP 支付申请步骤 APP 支付:APP 支付 ...

  3. iOS - PackIpa App 打包

    前言 打包 ipa 的前提 证书的申请和设置和 "App 上架" 文章的一样 从第一步到第四步都是一样的.还有第六步的 1-3 都是一样的,从第四步开始变化. 1.Archive ...

  4. js 时间格式化 代码

    Date.prototype.Format = function (fmt) { //author: meizz              var o = {                 &quo ...

  5. 01 ~ 03 headfirst php & mysql

    Question : 难道不是所有web页面原先都放在服务器上吗? 甚至存储在.html文件中的HTML页面? Answer : 没错, 网站的所有文件都存储在服务器上, html, css, php ...

  6. JavaScript中的编码函数

    JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...

  7. Java多线程总结之线程安全队列Queue

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非 ...

  8. nodejs的第四天学习笔记

    一. ECMAScript6(es2015)es6语法 es6/es2015,在es5的基础上扩展了很多新的功能,我们要学习仅仅是es6中的部分常用新功能,这些功能在使用的时候一定要慎重,因为他们之中 ...

  9. curl上传图片文件

    为了优化网站,需要做静态化和,图片分离 暂时想到的方式是: 1,php//input  流方式上传到远程服务器 2,阿里云oss收费服务 3,curl上传图片 4,phpftp上传图片 5, 服务器同 ...

  10. pom.xml里有红叉报错的解决办法

    pom.xml里有红叉报错的解决办法一: 1.把鼠标点在报的错上发现pom.xml报如下错误: Multiple annotations found at this line: - Failure t ...