Python入门:python实现http透明代理(二)

原创 2016年08月31日 15:33:47

编写此例只是因为个人在学习的过程中遇到了诸多问题,并且没有在网上找到一个比较全面的、浅析的案例,大多案例直接用到了select、queue等等,结构也特别清晰,导致不明白哪些是必要的,业务处理逻辑是什么样,所以在此写出来,作为自己的笔记,同时也可以供初学者参考
浏览器(C)—————-HttpProxy(HP)—————-web服务器(S)
要做http代理,这个代理即要做代理服务端,也要做客户端,要接收两头发来的数据,同时要将两头接收到数据转发至对方
1、C向S发送请求
2、HP拦截(处理)
3、HP处理完拦截的数据转发至S
4、S将返回的数据传递给HP
5、HP再将数据拦截(处理)
6、转交给C
1-6就完成了一次完整的请求

'''
python3.5.2
'''

import socket
import threading
import re


def proxy(ser):                                           #接收线程传递过来的socket对象
    conn,addr = ser.accept()                              #接收一个connection然后返回新的connection和address
    data = conn.recv(1024)                                #接收从conn收到的数据
    #print(data)                                          #查看接收到的内容,收到的数据是byte类型
    path_num = data.decode().find('\r\n')                 #解码byte类型数据为字符串,然后查找第一行的末尾数
    first_line = data.decode()[:path_num]                 #获取第一行数据(后续要用来判断请求的方法《method》和相对路径)
    remain_line = data.decode()[path_num:]                #获取http head及data,即除第一行以外的数据(需要了解http协议就知道为什么这样处理)
    method,path_url,protocol = first_line.split()         #http第一行数据中包含三个内容,用空格分割之后就得到三个(后面需要用)
    #print(method)                                        #查看method
    print(path_url)                                       #查看path_url(即全url)(后续需要用这个url分割相对路径)
    #print(protocol)                                      #查看protocol(即http的请求协议,一般就是“http/1.1”)
    host = re.findall(r'(?<=://).*?(?=/)',path_url)[0]    #从全url中分割出host(这个host是用来作为proxy转发到web服务器时的目标地址用)
    main_url = re.findall(r'.*?://',path_url)[0] + host   #从全url中分割出主url(即http://加host)
    #print(main_url)                                      #查看主url
    path = path_url[len(main_url):]                       #相对路径/shopxx-mobile/goods/list/243.jhtml
    s_data = method + ' ' + path + ' ' + protocol  + remain_line#将抓到的包进行处理,然后合并**作为**后续转发到web服务器的数据
    print(s_data)                                         #打印要发送的数据

    print(host)                                           #打印host
    try:                                                  #判断从抓取到的数据中的host是ip地址类型的,还是域名类型的,然后有不同处理
        r_host = socket.gethostbyname(host)               #尝试使用域名解析ip地址,如果解析成功就将port赋值80(这里不严谨,没有考虑https)
        port = '80'
    except:               
        if ':' in host:                                   #如果host中有“:”说明host就是ip地址,并分割出ip址和port
            r_host,port = host.split(':')
        else:
            port = '80'
    s_s = socket.socket()                                 #再创建一个sockte对象,用于前面分离出的ip与端口进行转发浏览器接收到的数据
    print(r_host,port)
    s_s.connect((r_host,int(port)))                       #连接从浏览器接收到的数据中的目标ip与端口
    print("############################")
    print(s_data)                                         #打印要转发的数据
    s_s.send(s_data.encode())                             #转发要发送的数据
    d = s_s.recv(1024)                                    #接收转发到web服务器的返回数据
    print(d)                                              #打印从web服务器返回的数据
    conn.send(d)                                          #将接收的数据使用最上面socket对象中的conn进行发送
    #ser.close()
    #s_s.close()


SER_ADDR = ('', 8088)           #因为socket中的bind需要一个地址与端口的tuple类型
ser = socket.socket()           #创建一个socket对象
ser.bind(SER_ADDR)              #对socket对象绑定地址和端口
ser.listen(5)                   #设置socket对象同时监听多少个链接

while True:                     #为开启线程循环
    t = threading.Thread(target=proxy(ser))
    t.start()

扩展:
Accept a connection. The socket must be bound to an address and listening for connections. The return value is a pair (conn, address) where conn is a new socket object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection.

版权声明:本文为博主原创文章,未经博主允许不得转载。

python使用http、https代理

在国内利用Python从Internet上爬取数据时,有些网站或API接口被限速或屏蔽,这时使用代理可以加速爬取过程,减少请求失败,Python程序使用代理的方法主要有以下几种: (1)如果是在代码中...
  • wanghong5211
  • wanghong5211
  • 2017年04月24日 13:28
  • 1843

使用 Python 进行HTTP代理 多线程刷(投)票

这几天朋友参加比赛需要,就写了个脚本帮忙刷票. 我们首先来到要投票的网站上来看看。 随便找一个投上一票 居然不用登陆,当然是每个IP只能投一票。 打开Chrome dev tools, 看一下...
  • Relocy
  • Relocy
  • 2016年05月29日 18:44
  • 2071

Python入门:python实现http透明代理(三)

import socket import threading import re import select import queue class Proxy(threading.Thread): ...
  • foryouslgme
  • foryouslgme
  • 2016年09月02日 10:47
  • 468

Python入门:python实现http透明代理

#-*- coding: UTF-8 -*- import socket,select import sys import threading from multiprocessing import ...
  • foryouslgme
  • foryouslgme
  • 2016年08月23日 15:22
  • 877

HTTPS代理明文截获之证书伪造(Python)

为了防止网络中的明文信息的在传输过程中被截获,SSL/TSL为各种应用协议加密封装提供了一个不错的解决方案,作为一种公开的加密协议,采用非对称加密的方式来传输密钥无疑为提供了不错的安全保障。由于现今的...
  • terry1201
  • terry1201
  • 2015年08月25日 13:19
  • 3029

HTTP透明代理

之所以强调是“透明”代理,也就是说这样的代理对客户端来说是不可见的,并不需要在客户端的浏览器中作关于代理的设置。假设有这样的典型NAT网络环境:网关: 192.168.0.1客户端:192.168.0...
  • hulifox007
  • hulifox007
  • 2009年01月04日 21:58
  • 14696

透明代理、匿名代理、混淆代理、高匿代理有什么区别?

这4种代理,主要是在代理服务器端的配置不同,导致其向目标地址发送请求时,REMOTE_ADDR, HTTP_VIA,HTTP_X_FORWARDED_FOR三个变量不同。 1、透明代理(Tran...
  • a19860903
  • a19860903
  • 2015年07月30日 10:56
  • 18704

47.HTTP代理(转发代理&反向代理)与重定向

介绍HTTP的转发代理与反响代理的区别,以及代理与重定向的区别。
  • a464057216
  • a464057216
  • 2016年10月04日 08:09
  • 3709

Python 批量获取代理服务器IP并测试

转载:http://blog.csdn.net/abcamus/article/details/52993711 #-*-coding:utf-8 -*- import urllib2 import...
  • xfyangle
  • xfyangle
  • 2017年03月13日 13:13
  • 1057

50行python代码实现个代理服务器(你懂的)

之前遇到一个场景是这样的: 我在自己的电脑上需要用mongodb图形客户端,但是mongodb的服务器地址没有对外网开放,只能通过先登录主机A,然后再从A连接mongodb服务器B。 本来想通过s...
  • u010180339
  • u010180339
  • 2014年09月17日 20:34
  • 9801
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python入门:python实现http透明代理(二)
举报原因:
原因补充:

(最多只允许输入30个字)