基于fiddler的网络爬虫校园网自动登陆系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu132563/article/details/86579890

最近校园网(需要WEB登陆)不太稳定,总是掉线,于是想写一个基于网络爬虫的校园网自动登陆系统,让程序自动每隔一段时间自动检测网络连通性,查了一些资料,最后用了Fiddler软件进行网络监听,对网页http请求的内容和参数进行了解。

Fiddler基础知识

  • Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改。
  • 代理就是在客户端和服务器之间设置一道关卡,客户端先将请求数据发送出去后,代理服务器会将数据包进行拦截,代理服务器再冒充客户端发送数据到服务器;同理,服务器将响应数据返回,代理服务器也会将数据拦截,再返回给客户端。
  • Fiddler可以抓取支持http代理的任意程序的数据包,如果要抓取https会话,要先安装证书。

HTTP协议

  • 要分析Fiddler抓取的数据包,我们首先要熟悉HTTP协议。HTTP即超文本传输协议,是一个基于请求与响应模式的、无状态的、应用层的协议,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
  • HTTP的工作过程:当我们请求一个超链接时,HTTP就开始工作了,客户端先发送一个请求到服务器,请求内容包括:协议版本号、请求地址、请求方式、请求头和请求参数;服务器收到请求后做相应的处理,并将响应数据返回到客户端,响应内容包括:协议版本号、状态码和响应数据。前端根据响应数据做相应的处理,就是最终我们看到的内容。这些过程是HTTP自动完成的,我们只是输入或点击请求地址,然后查看前端给我们展示的内容。更多关于HTTP协议的介绍请参考:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
  • 请求方式常用的有:GET、PUT、POST、DELETE。
  • HTTP状态码主要分为5类:以1开头的代表请求已被接受,需要继续处理;以2开头的代表请求已成功被服务器接收、理解、并接受;以3开头的代表需要客户端采取进一步的操作才能完成请求;以4开头的代表了客户端看起来可能发生了错误,妨碍了服务器的处理;以5开头的代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。
  • 常见的主要有:200:服务器成功处理了请求;404:未找到资源;500:内部服务器错误;503:服务器目前无法为请求提供服务;302:请求的URL已临时转移;304:客户端的缓存资源是最新的,要客户端使用缓存。
  • 每个状态码的详细介绍请参考:https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin

Fiddler抓包原理

注意:Fiddler 是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888。当Fiddler退出的时候它会自动注销,这样就不会影响别的 程序。不过如果Fiddler非正常退出,这时候因为Fiddler没有自动注销,会造成网页无法访问。解决的办法是重新启动下Fiddler。

配置

打开Fiddler  Tool->Fiddler Options->HTTPS 。  (配置完后记得要重启Fiddler).

选中"Decrpt HTTPS traffic",    Fiddler就可以截获HTTPS请求,第一次会弹出证书安装提示,若没有弹出提示,勾选Actions-> Trust Root Certificate

另外,如果你要监听的程序访问的 HTTPS 站点使用的是不可信的证书,则请接着把下面的 “Ignore servercertificate errors” 勾选上。

证书安装提示:

点击Yes,留意一下红框里面的内容,DO_NOT_TRUST_FiddlerRoot ,这个就是证书的名称。 

点击是。 

点击确定,这样Fiddler证书就已经添加成功了。

查看一下证书,Actions—>open windows certificate Manager 

可以证书已经添加进去了,证书名称就是之前提醒大家留意的,【DO_NOT_TRUST_FiddlerRoot】

手机端包抓取可参考https://www.cnblogs.com/woaixuexi9999/p/9247705.html

上面我们对Fiddler的架构和配置进行了相应的介绍,下面详细介绍程序具体实现过程

先上图

上面就是打开我们学校登录界面的报文头和响应,然后查看一下输入账号密码以后的参数信息,具体信息见程序,下面直接放程序了,详细信息可以去网上搜索,很简单的

import requests
import time
from time import sleep
url = '登录网址'

def login():
    postdata = {'username': '账号',
                'password': '密码',
                'action': 'login',
                'ac_id': '1',
                'user_ip':'',
                'nas_ip':'',                           //具体信息每个网站不一样,需要用
                'user_mac':'',                         //fiddiler来查看webForms信息
                'url':'登录网址',
                'save_me':'1'}
    headers = {'Accept': 'application/x-ms-application,image/jpeg,application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*',
               'Accept-Encoding': 'gzip, deflate',
               'Accept-Language': 'zh-CN',
               'Connection': 'Keep-Alive',              //这是登录界面请求报文头
               'Content-Length': '4587',
               'Content-Type': 'text/html',
               'Cookie': 'login=bQ0o5ZADI11BgO3HLndd%252Bxt3LbV4WDOtcmv8IeEY8w0yxL3s6DIILB0Jrp9m%252B0wjynVc1ZISbR2DkFEzIYuAuCBLlsfcmLRwjsHsaSehvpE93gH54HtueO9Pg5M0piPVpxV2eNMeSXyeR%252FqX%252BBsi6HXaB%252Fgrb%252FtLaQW9Zpc%253D; UM_distinctid=1676291cc5fe3-0be363d479ccea-3a064d5a-100200-1676291cc70ef',
               'Host': '具体参数见fiddiler报文头信息',
               'Referer': '具体参数见fiddiler报文头信息',
               'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)'}
    requests.post(url, data=postdata)

#检查内网是不是联通
def is_connect_edu():
    status_code = requests.get(url).status_code
    if status_code == 200:
        return True
    else:                                                
        return False

#检查外网是不是联通
def is_connect_web():
    r = requests.get("http://www.baidu.com").text
    if r.find('baidu.com') != -1:
        return True
    else:
        return False

#周期性检查网络连通性
while True:
    if is_connect_edu():
        if not is_connect_web():
            print("Network disconnected, try connecting...")
            login()
            if requests.get('http://www.baidu.com').status_code==200:
                x='Network back to normal at '
                y=time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())
                print(x+y)
            else:
                x='Network connection failed at '
                y=time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())
                print(x+y)
        else:
                x='Network connection normal at '
                y=time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())
                print(x+y)
        time.sleep(5)

完毕!!

网上有很多有关网络爬虫的实例,还是很有用的,这个看不懂,大家去找一些通俗易懂的吧。。。

下面给几个比较好的参考文献:

https://blog.csdn.net/abitch/article/details/51939879

https://blog.csdn.net/hty46565/article/details/72822447

https://uule.iteye.com/blog/2408809

https://blog.csdn.net/u010651394/article/details/82975266

https://blog.csdn.net/shenhuaifeng/article/details/78333851

https://blog.csdn.net/internethk2/article/details/79196915

https://blog.csdn.net/shenhuaifeng/article/details/78333851

https://sunlanchang.github.io/2017/10/31/%E6%A0%A1%E5%9B%AD%E7%BD%91%E8%87%AA%E5%8A%A8%E7%99%BB%E5%BD%95%E8%84%9A%E6%9C%AC/    

(最后一篇强烈建议)

猜你喜欢

转载自blog.csdn.net/yu132563/article/details/86579890