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)如果是在代码中...

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

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

python实战--Http代理服务器

打算好好深入研究下pytho的socket编程,那天看了这篇博文,http://www.apprk.com/archives/146,于是打算学习下,仿写了一下,发现写好还真不容易,中途出现很多问题,...

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

之前遇到一个场景是这样的: 我在自己的电脑上需要用mongodb图形客户端,但是mongodb的服务器地址没有对外网开放,只能通过先登录主机A,然后再从A连接mongodb服务器B。 本来想通过s...

Python穿越http代理

Python穿越http代理在有http代理的网络中,如公司的内网,链接外部网络都会有一层防火墙,拦截一些非工作网站。 如果要越过防火墙的拦截,可以通过在http代理上创建一层socket加密通...

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

#-*- coding: UTF-8 -*- import socket,select import sys import threading from multiprocessing import ...

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

import socket import threading import re import select import queue class Proxy(threading.Thread): ...

python使用代理访问网站

获取不同的IP 使用不同的user-agent #!/usr/bin/python # coding:utf-8 import re import random import sys i...

Python获取免费的可用代理

Python获取免费的可用代理在使用爬虫多次爬取同一网站时,经常会被网站的ip反爬虫机制给禁掉,这时就可以通过使用代理来解决。目前网上有很多提供最新免费代理列表的网站,这些列表里很多的代理主机是可用的...

python中requests使用代理proxies

学习网络爬虫难免遇到使用代理的情况,下面介绍一下如何使用requests设置代理: 如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求: import requ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python入门:python实现http透明代理(二)
举报原因:
原因补充:

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