当前位置:网站首页>Python3網路學習案例四:編寫Web Proxy
Python3網路學習案例四:編寫Web Proxy
2020-11-06 01:17:00 【itread01】
代理伺服器的定義和作用請走百度百科~
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
版权声明
本文为[itread01]所创,转载请带上原文链接,感谢
https://www.itread01.com/content/1604502065.html
边栏推荐
- Gradient understanding decline
- 如果前端不使用SPA又能怎样?- Hacker News
- 如何将数据变成资产?吸引数据科学家
- Azure Data Factory(三)整合 Azure Devops 實現CI/CD
- 8.1.1 handling global exceptions through handlerexceptionresolver
- 从零学习人工智能,开启职业规划之路!
- 向北京集结!OpenI/O 2020启智开发者大会进入倒计时
- 01 . Go语言的SSH远程终端及WebSocket
- WeihanLi.Npoi 1.11.0/1.12.0 Release Notes
- 6.9.1 flashmapmanager initialization (flashmapmanager redirection Management) - SSM in depth analysis and project practice
猜你喜欢
DRF JWT authentication module and self customization
Probabilistic linear regression with uncertain weights
安装Anaconda3 后,怎样使用 Python 2.7?
神经网络简史
Basic principle and application of iptables
从零学习人工智能,开启职业规划之路!
读取、创建和运行多个文件的3个Python技巧
drf JWT認證模組與自定製
PPT画成这样,述职答辩还能过吗?
Outlier detection based on RNN self encoder
随机推荐
企业数据库的选择通常由系统架构师主导决策 - thenewstack
【C/C++ 2】Clion配置与运行C语言
WeihanLi.Npoi 1.11.0/1.12.0 Release Notes
7.2.2 compressing static resources through gzipresourceresolver
How to get started with new HTML5 (2)
Cos start source code and creator
制造和新的自动化技术是什么?
接口压力测试:Siege压测安装、使用和说明
前端模組化簡單總結
用Python构建和可视化决策树
十二因子原则和云原生微服务 - DZone
向北京集结!OpenI/O 2020启智开发者大会进入倒计时
免费的专利下载教程(知网、espacenet强强联合)
10 easy to use automated testing tools
微服務 - 如何解決鏈路追蹤問題
keras model.compile损失函数与优化器
Basic principle and application of iptables
小白量化投资交易入门课(python入门金融分析)
神经网络简史
遞迴思想的巧妙理解