1. 程式人生 > >Python3網路學習案例四:編寫Web Proxy

Python3網路學習案例四:編寫Web Proxy

代理伺服器的定義和作用請走百度百科~

1. Web Proxy的實現思路

這是基於上一篇“編寫Web Server”寫的,主要邏輯見下圖:

 

 我們要寫的就是中間的Web Proxy部分,當客戶端向Web Proxy傳送對某一個網址的訪問請求(Request)時,Web Proxy會首先檢視自己是否有該請求檔案,如果有則直接返回(Response),如果沒有,Web Proxy就要像Web Server(該訪問網址的伺服器)傳送請求來獲取目標檔案,然後再向Client返回。

2. Web Proxy的使用

首先,我們在訪問一個網址時為了通過代理訪問就不能簡單地開啟瀏覽器輸入網址進行訪問(那樣就變成Client直接向Web Server傳送Reuest了),在這裡可以下載一個名為Wget的工具,這個東西對於Web Proxy就好像是jdk對於Java一樣(當然也許有其他的工具可以先訪問代理伺服器,這裡不討論),下載完成後可以解壓就可以使用了,就像使用jdk一樣首先在命令列視窗中找到該檔案所在資料夾,如果不想每次都輸入一串目錄來查詢的話也可以將這個檔案的路徑新增至環境變數(至於如何配置自行搜尋)。

當Web Proxy和Wget都準備好之後就可以開始運行了:

首先執行Web Proxy程式,然後通過Wget請求使用代理並且傳送Request

(Wget命令:wget xxx.xxx.xx -e use_proxy=on -e http_proxy=127.0.0.1:8000),其中“xxx.xxx.xx”就是你要請求的網址

3. Web Proxy原始碼

import socket


def handleReq(clientSocket):
    # recv data
    # find the fileName
    # judge if the file named "fileName" if existed
    # if not exists, send req to get it

    recvData = clientSocket.recv(1024).decode()
    fileName = recvData.split()[1].split("//")[1].replace('/', '')
    print("fileName: " + fileName)
    try:
        file = open(fileName, 'rb')
        print("File is found in proxy server.")
        responseMsg = file.readlines()
        for i in range(0, len(responseMsg)):
            clientSocket.sendall(responseMsg[i])
        print("Send, done.")
    except Exception:
        try:
            print("File is not exist.\nSend request to server...")
            proxyClientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            serverName = fileName.split(":")[0]
            proxyClientSocket.connect((serverName, 80))
            proxyClientSocket.sendall(recvData.encode())
            responseMsg = proxyClientSocket.recv(4069)
            print("File is found in server.")
            proxyClientSocket.sendall(responseMsg)
            print("Send, done.")
            # cache
            cache = open("./" + fileName, 'w')
            cache.writelines(responseMsg.decode().replace('\r\n', '\n'))
            cache.close()
            print("Cache, done.")
        except:
            print("Connect timeout.")


def startProxy(port):
    proxyServerSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    proxyServerSocket.bind(("", port))
    proxyServerSocket.listen(0)
    while True:
        try:
            print("Proxy is waiting for connecting...")
            clientSocket, addr = proxyServerSocket.accept()
            print("Connect established")
            handleReq(clientSocket)
            clientSocket.close()
        except Exception as e:
            print("error: {0}".format(e))
            break
    proxyServerSocket.close()


if __name__ == '__main__':
    while True:
        try:
            port = int(input("choose a port number over 1024:"))
        except ValueError:
            print("Please input an integer rather than {0}".format(type(port)))
            continue
        else:
            if port <= 1024:
                print("Please input an integer greater than 1024")
                continue
            else:
                break
    startProxy(port)

4. Wget工具包

連結:https://pan.baidu.com/s/1Ae2_Cq9SYbKnfhhyJ1VhpQ
提取碼:awsl 

&n