基於fiddler的網絡爬蟲校園網自動登陸系統

最近校園網(需要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/    

(最後一篇強烈建議)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章