python 实现简单 http 代理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 实现简单 http 代理相关的知识,希望对你有一定的参考价值。
有台 openwrt 路由器,16M flash存储 + 64M 内存 ,可以装 python 。因为没有自带 url 网站访问记录,想手写一个。
原理:
http 1.1 也就是 tcp 连接,有 header 和 body
使用 python listen 8000 端口
设置浏览器,使用 localhost 8000 http 代理方式
源码 py2.7:
1 #coding:utf-8 2 import socket 3 import sys 4 import re 5 import os 6 import time 7 8 host = ‘0.0.0.0‘ 9 port = 8000 10 11 #创建socket对象 12 proxy_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 13 try: 14 proxy_sock.bind((host,port)) 15 except: 16 sys.exit("python proxy bind error ") 17 18 print "python proxy open" 19 20 proxy_sock.listen(1024) 21 while True: 22 conn,addr = proxy_sock.accept() 23 os.fork() 24 print "client connent:{0}:{1}".format(addr[0], addr[1]) 25 26 #接收数据 27 client_data = conn.recv(1024) 28 29 #分析得到 header 信息 30 header = client_data.split("\r\n") 31 host = header[1].split(":")[1].strip() 32 url = header[0].split(" ")[1].strip() 33 34 #统计访问记录 35 print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) 36 print host 37 print url 38 39 #建立连接 40 http_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 41 http_sock.connect((host, 80)) 42 http_sock.sendall(client_data) 43 while(True): 44 http_data = http_sock.recv(1024) 45 if http_data: 46 conn.send(http_data) 47 else: 48 break 49 http_sock.close() 50 51 #关闭所有连接 52 proxy_sock.close() 53 print "python proxy close"
从 header 中 可以提取到,访问的网址, cookie 等信息,理论上 非 https 也可以提取到 post 的信息。
缺点是,性能不好,没有实现 Connection : keep-alive
因为使用了 fork() win 中 应该是不能用。
看来,还是要加在网卡驱动中比较好。
以上是关于python 实现简单 http 代理的主要内容,如果未能解决你的问题,请参考以下文章