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
Python3网络学习案例四:编写Web Proxy的更多相关文章
- Python3网络学习案例三:编写web server
1. 写在前面 这里总结的并不够详细,有时间了再进行补充. 2. 设计思路 HTTP协议是建立在TCP上的1. 建立服务器端TCP套接字(绑定ip,port),等待监听连接:listen(2. 打开浏 ...
- Python3网络学习案例一:Ping详解
1. 使用Ping做什么 ping用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常.网络是否通畅等. 2. 效 ...
- Python3网络学习案例二:traceroute详解
1. 写在前面 本文是基于上一篇"ping详解"写的: 不同操作系统下的命令也不同,本文仅针对windows系统,命令为"tracert xxx",效果如下 2 ...
- python3.4学习笔记(四) 3.x和2.x的区别,持续更新
python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...
- Beego学习笔记四:编写Model
MVC实践一:编写模型 1> 打开mysql数据库,设计表的结构 <1>登录mysql数据库,如下 <2>这三个标注的参数皆有用,需要谨记. <3>创 ...
- python3语法学习第四天--字符串
字符串:是python中的常用数据类型 Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用 访问字符串的值: 下标和分片截取 字符串的连接:‘+’ 字符串内置函数挺多,选 ...
- python3语法学习第四天--序列
序列是Python中最基本的数据结构. 序列中的每个元素都分配一个索引从0开始依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列可以的操作:索引,切片,加,乘,检查成员. 此 ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- 从零开始学习PYTHON3讲义(十四)写一个mp3播放器
<从零开始PYTHON3>第十四讲 通常来说,Python解释执行,运行速度慢,并不适合完整的开发游戏.随着电脑速度的快速提高,这种情况有所好转,但开发游戏仍然不是Python的重点工作. ...
随机推荐
- HTML+CSS系列:登录界面实现
一.效果 二.具体实现 1.index.html <!DOCTYPE html> <html> <head> <meta charset="utf- ...
- 记录从Winserver2012R2升级到Winserver2019
升级系统是必不可少的,最近想搞虚拟化Hyper-V:于是着手需要装一台WIN server 2019. 手头有一台Winserver 2012R2,正好拿来测试升级,此博做一个记录. 操作流程:在升级 ...
- 0xctf[No parameters readfile](魔改版[GXYCTF2019]禁止套娃)
阅读本文前建议先阅读本站中的另一篇文章:[GXYCTF2019]禁止套娃 重要参考链接:http://www.heetian.com/info/827 Leon师傅魔改了[GXYCTF2019]禁止套 ...
- ORA-00001: unique constraint (string.string) violated 违反唯一约束条件(.)
ORA-00001: unique constraint (string.string) violated ORA-00001: 违反唯一约束条件(.) Cause: An UPDATE or I ...
- 用pChart生成雷达图图片
需求 :由于工作需要,需要在一张背景图上添加这一张雷达图,之后图片可以在微信中长按保存.所以说我必须生成一张带有雷达图的图片第一反应是用百度echars雷达图做动态显示,之后截图.考虑到工作量和效率, ...
- Jersey实现跨服务器上传图片:UniformInterfaceException:403 Forbidden
jersey.api.client.UniformInterfaceException :returned a response status of 403 Forbidden 图片服务器:端口808 ...
- java基础语句翻译
public static void main(String[] args) { System.out.println("人生中的第一个代码-----"); } } package ...
- Springboot+JPA下实现简易爬虫:豆瓣电视剧数据
Springboot+JPA下实现简易爬虫:豆瓣电视剧数据 前言:今天听到产品那边讨论一些需求,好像其中一点是用户要求我们爬虫,在网页上抓取一些数据然后存到我们公司数据库中,众所周知,爬虫的实现对于p ...
- pytest+allure生成接口自动化测试报告
准备环境 1.安装pytest pip install pytest -i http://pypi.douban.com/simple pytest-ordering pytest.main([ &q ...
- spring boot:基于profile的多环境配置(spring boot 2.3.4)
一,为什么要进行多环境配置? 1,没有人会在生产环境中进行开发和测试, 所以通常会有多个环境的划分: 工程师本地的开发环境 进行测试的测试环境 最终上线的生产环境 每个环境对应不同的数据库/缓存等数据 ...