一、首先什么是代理:

  代理其实就是中间转发的那个玩意,所以在代码逻辑上也是如此的。

二、Python写http代理的基本逻辑:

  (1)接受浏览器发出的请求,解析,拼凑成该有的样子,然后使用套接字发出去。

  (2)完了,其实Demo就这么简单。

三、下面讲讲如何接受浏览器发起的请求,其实只要是请求就可以,没必要是浏览器的。外部发来的请求一样OK哦。

#接受请求就是一个服务器,没毛病老铁。所以用到了一个库BaseHTTPServer

 #-*- coding:utf-8 -*-

 #import lib-file
import urllib
import socket
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer #define handler function class
class MyHandler(BaseHTTPRequestHandler):
#HTTP method GET (e.x.)
def do_GET(self):
url = self.path
print "url:",url
protocol,rest = urllib.splittype(url)
print "protocol:",protocol
host,rest = urllib.splithost(rest)
print "host:",host
path = rest
print "path:",path
host,port = urllib.splitnport(host)
print "host:",host
port = 80 if port < 0 else port
host_ip = socket.gethostbyname(host)
print (host_ip,port)
#above easy to understand
del self.headers['Proxy-Connection']
print self.headers
self.headers['Connection'] = 'close'
#Above! Three lines code removes Proxy-Connection columns and set connection to close to make sure no keep-alive link
#Bottom! Lines make request like what we see in the burpsuite!
send_data = 'GET ' + path + ' ' + self.protocol_version + '\r\n'
head = ''
for key, val in self.headers.items():
head = head + "%s: %s\r\n" % (key, val)
send_data = send_data + head + '\r\n'
print send_data
#
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((host_ip,port))
client.send(send_data)
#while True:
# ret = server.recv(4096)
# print ret
data = ''
while True:
tmp = client.recv(4096)
if not tmp:
break
data = data + tmp # socprint data
client.close()
self.wfile.write(data)

看逻辑很简单,利用basehttpserver 收请求socket转发

起main函数:

 def main():
try:
server = HTTPServer(('127.0.0.1', 8888), MyHandler)
print 'Welcome to the machine...'
server.serve_forever()
print "testend"
except KeyboardInterrupt:
print '^C received, shutting down server'
server.socket.close() if __name__ == '__main__':
main()

这里可以看到已经ok了,但是由于百度那边跳转和阻塞,还是没能成功完成代理,不过数据包确确实实转发出去了,但是代码逻辑已经ok。

参考:

http://www.lyyyuna.com/2016/01/16/http-proxy-get1/

python实现HTTP代理的思路和Demo的更多相关文章

  1. 关于网页游戏断线重连的思路和demo求助

    http://bbs.9ria.com/thread-146997-1-1.html —————————————————————————————————————————————————— 1:俺有什么 ...

  2. Python来做应用题及思路

    Python来做应用题及思路 最近找工作头疼没事就开始琢磨python解应用题应该可以,顺便还可以整理下思路当然下面的解法只是个人理解,也欢迎大佬们给意见或者指点更好的解决办法等于优化代码了嘛,也欢迎 ...

  3. python socket之tcp服务器与客户端demo

    python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...

  4. [转]使用 mitmproxy + python 做拦截代理

    使用 mitmproxy + python 做拦截代理   本文是一个较为完整的 mitmproxy 教程,侧重于介绍如何开发拦截脚本,帮助读者能够快速得到一个自定义的代理工具. 本文假设读者有基本的 ...

  5. Python 爬虫的代理 IP 设置方法汇总

    本文转载自:Python 爬虫的代理 IP 设置方法汇总 https://www.makcyun.top/web_scraping_withpython15.html 需要学习的地方:如何在爬虫中使用 ...

  6. python设计模式之代理模

    python设计模式之代理模式 在某些应用中,我们想要在访问某个对象之前执行一个或多个重要的操作,例如,访问敏感信息--在允许用户访问敏感信息之前,我们希望确保用户具备足够的权限.操作系统中也存在类似 ...

  7. python爬虫构建代理ip池抓取数据库的示例代码

    爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...

  8. python多线程建立代理ip池

    之前有写过用单线程建立代理ip池,但是大家很快就会发现,用单线程来一个个测试代理ip实在是太慢了,跑一次要很久才能结束,完全无法忍受.所以这篇文章就是换用多线程来建立ip池,会比用单线程快很多.之所以 ...

  9. python turtle库的几个小demo

    一.先上图 一个同切圆和五角星 上代码 import turtle #同切圆 turtle.pensize(2) turtle.circle(10) turtle.circle(40) turtle. ...

随机推荐

  1. ubuntu 命令 dpkg -l

    dpkg -l 每条记录对应一个软件包,每条记录的第一, 二, 三个字符是软件包的状态标识, 后边依此是软件包名称,版本号, 和简单描述. 关于每个状态,可以参考 man dpkg-query 关于每 ...

  2. easui Pagination Layout

    分页显示方式有几种 layout: ['first', 'prev', 'next', 'last'] layout: ['list', 'sep', 'first', 'prev', 'sep', ...

  3. C++隐式转换与显式转换

    普通类型的转换顺序:隐式把char——>int和从short——>double.转换可能会导致数据的丢失. 自定义类型:有两种函数可以进行隐式转换,单参数构造函数 和 隐式类型转换符.   ...

  4. NGUI使用教程 安装NGUI插件

    我的使用的是unity4.2,大家可以去官网下载最新版本的http://unity3d.com/unity/download作为一个开发人员安装编译器是最基本的常识,相信大家都能正确安装.安装成功号桌 ...

  5. 关于win7下安卓开发环境的搭建

    一.下载安装JDK(不用配置环境变量) 1.先卸载原来存在的JDK 控制面板-卸载程序-有两个软件(Java SE Development Kit 8 Update 101(64-bit)和Java ...

  6. t-SNE可视化(MNIST例子)

    如下所示: import pickle as pkl import numpy as np from matplotlib import pyplot as plt from tsne import ...

  7. Hibernate一级缓存、二级缓存以及查询缓存的关系

    转载自http://blog.csdn.net/maoyeqiu/article/details/50209893 前两天总结了一下二级缓存和查询缓存的关系,但是又有一个新的问题,就是查询缓存缓存到二 ...

  8. (转)PS流格式

    概念: 将具有共同时间基准的一个或多个PES组合(复合)而成的单一的数据流称为节目流(Program Stream). ES是直接从编码器出来的数据流,可以是编码过的视频数据流,音频数据流,或其他编码 ...

  9. taskAffinity属性

    Activity的归属,也就是Activity应该在哪个Task中,Activity与Task的吸附关系.我们知道,一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Tas ...

  10. postman从入门到精通

    今天总监让我给测试同事们培训postman,使用过postman的朋友应该知道,这个简直就是前后端接口调试神器.根据平时的经验以及自己到网上看了相关的帖子,对于postman又有了新的认识. post ...