当前位置:网站首页>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
边栏推荐
- Sort the array in ascending order according to the frequency
- 你的财务报告该换个高级的套路了——财务分析驾驶舱
- How to get started with new HTML5 (2)
- 使用Asponse.Words處理Word模板
- 人工智能学什么课程?它将替代人类工作?
- 6.9.1 flashmapmanager initialization (flashmapmanager redirection Management) - SSM in depth analysis and project practice
- 微信小程序:防止多次点击跳转(函数节流)
- nlp模型-bert从入门到精通(二)
- 2018个人年度工作总结与2019工作计划(互联网)
- 谁说Cat不能做链路跟踪的,给我站出来
猜你喜欢
随机推荐
Query意图识别分析
如何在Windows Server 2012及更高版本中將域控制器降級
Listening to silent words: hand in hand teaching you sign language recognition with modelarts
Vue.js移动端左滑删除组件
tensorflow之tf.tile\tf.slice等函数的基本用法解读
網路程式設計NIO:BIO和NIO
GBDT与xgb区别,以及梯度下降法和牛顿法的数学推导
企业数据库的选择通常由系统架构师主导决策 - thenewstack
什么是无副作用的函数方法?如何取名? - Mario
向北京集结!OpenI/O 2020启智开发者大会进入倒计时
7.3.2 File Download & big file download
Chainlink将美国选举结果带入区块链 - Everipedia
【QT】 QThread部分原始碼淺析
谁说Cat不能做链路跟踪的,给我站出来
JetCache埋点的骚操作,不服不行啊
如何对Pandas DataFrame进行自定义排序
技術總監,送給剛畢業的程式設計師們一句話——做好小事,才能成就大事
python 保存list数据
遞迴思想的巧妙理解
ThreadLocal原理大解析