python实现HTTP代理的思路和Demo
一、首先什么是代理:
代理其实就是中间转发的那个玩意,所以在代码逻辑上也是如此的。
二、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的更多相关文章
- 关于网页游戏断线重连的思路和demo求助
http://bbs.9ria.com/thread-146997-1-1.html —————————————————————————————————————————————————— 1:俺有什么 ...
- Python来做应用题及思路
Python来做应用题及思路 最近找工作头疼没事就开始琢磨python解应用题应该可以,顺便还可以整理下思路当然下面的解法只是个人理解,也欢迎大佬们给意见或者指点更好的解决办法等于优化代码了嘛,也欢迎 ...
- python socket之tcp服务器与客户端demo
python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...
- [转]使用 mitmproxy + python 做拦截代理
使用 mitmproxy + python 做拦截代理 本文是一个较为完整的 mitmproxy 教程,侧重于介绍如何开发拦截脚本,帮助读者能够快速得到一个自定义的代理工具. 本文假设读者有基本的 ...
- Python 爬虫的代理 IP 设置方法汇总
本文转载自:Python 爬虫的代理 IP 设置方法汇总 https://www.makcyun.top/web_scraping_withpython15.html 需要学习的地方:如何在爬虫中使用 ...
- python设计模式之代理模
python设计模式之代理模式 在某些应用中,我们想要在访问某个对象之前执行一个或多个重要的操作,例如,访问敏感信息--在允许用户访问敏感信息之前,我们希望确保用户具备足够的权限.操作系统中也存在类似 ...
- python爬虫构建代理ip池抓取数据库的示例代码
爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...
- python多线程建立代理ip池
之前有写过用单线程建立代理ip池,但是大家很快就会发现,用单线程来一个个测试代理ip实在是太慢了,跑一次要很久才能结束,完全无法忍受.所以这篇文章就是换用多线程来建立ip池,会比用单线程快很多.之所以 ...
- python turtle库的几个小demo
一.先上图 一个同切圆和五角星 上代码 import turtle #同切圆 turtle.pensize(2) turtle.circle(10) turtle.circle(40) turtle. ...
随机推荐
- 基于Dedup的数据打包技术
基于Dedup的数据打包技术 0.引言 Tar, winrar, winzip是最为常见的数据打包工具软件,它们把文件集体封装成一个单独的数据包,从而方便数据的分布.传输.归档以及持久保存等目的 ...
- Spring 4 官方文档学习(十一)Web MVC 框架之themes
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-themeresolver ...
- e679. 浮雕化图像
This example demonstrates a 3x3 kernel that embosses an image. Kernel kernel = new Kernel(3, 3, new ...
- java---final、finally、finalize的区别
Java finalize方法使用 标签: javaappletobjectwizardjvm工作 2011-08-21 11:37 48403人阅读 评论(5) 收藏 举报 分类: Java(96 ...
- C++多线程环境下注意共享资源的释放顺序
比如我现在写一个多线程下载程序,包含DownloadTask.HttpDownload两个类. class DownloadTask { //省略n行代码 public: int m_threads; ...
- js 离开页面
序言 大家是否经常遇到在关闭网页的时候,会看到一个确定是否离开当前页面的提示框?想一些在线测试系统.信息录入系统等就经常会有这一些提示,避免用户有意或者无意中关掉了页面,导致数据丢失.这里面的实现过程 ...
- PHP实现一个ip(如:127.0.0.1)和多个域名(虚拟主机)的绑定
解决方案一:通过端口来区分不同的虚拟主机 ①按照绑定一个站点的方法做好准备 1. 先开发好自己的网站(d:/myblog(存放在D盘的myblog目录下)) 2. 配置httpd.conf文件(存放在 ...
- linq select
var categoryIdArray = MusicCategoryRelationBLL.GetModel(music.Id); music.MusicCategoryIds = string.E ...
- Cocos2d-x3.0终于版Mac以及Win系统相关环境部署
因个人原因此博客停止更新,其它更新博文将在该博客继续更新. http://blog.csdn.net/xiaohan_aimti/article/details/24653831 就在前几天,2014 ...
- quick-cocos2d-x游戏开发【10】——触摸捕获事件 cc.NODE_TOUCH_CAPTURE_EVENT
假设看过sample中touch的代码,你会发现演示样例中有一个cc.NODE_TOUCH_CAPTURE_EVENT事件.它和cc.NODE_TOUCH_EVENT触摸事件一样,是引擎级别的事件,我 ...