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 代理的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

java代理机制简单实现

Requests库:python实现的简单易用的http库

实现一个简单的Http代理服务器

实现一个简单的Http代理服务器

python 用于在终端中运行的sublime text 3的简单代码片段制作工具