美文网首页python交流学习
想知道Python是如何进行HTTP代理的吗?

想知道Python是如何进行HTTP代理的吗?

作者: 78c40b03ee4e | 来源:发表于2019-03-01 15:33 被阅读0次

前言

每个人都应该非常熟悉HTTP代理,它在许多领域都有非常广泛的应用程序。HTTP代理分为正向代理和反向代理。后者通常用于向用户提供防火墙后的服务,以进行访问或负载平衡。通常是nginx,haproxy等等。本文讨论了正向代理。

HTTP代理最常见的用途是用于网络共享、网络加速和网络限制突破。此外,HTTP代理也常用于Android/iOS应用程序中调用的Web应用程序的调试、监控和分析。目前,著名的软件包括小提琴、查尔斯、伯普套房和米特罗西。HTTP代理还可以用于修改请求/响应内容、向Web应用程序添加附加功能或在不更改服务器端的情况下更改应用程序行为。

HTTP代理

HTTP代理本质上是一个Web应用程序,它与其他常见的Web应用程序没有根本区别。HTTP代理在接收到请求后,根据头中主机字段的主机名和get/post请求地址综合判断目标主机,建立新的HTTP请求并转发请求数据,将接收到的响应数据转发给客户端。

如果请求地址是绝对地址,HTTP代理将使用该地址中的主机,否则将使用头中的主机字段。对于简单测试,假设网络环境如下:

  • 192.168.1.2 Web服务器
  • 192.168.1.3 HTTP代理服务器

使用telnet进行测试

$ telnet 192.168.1.3
GET / HTTP/1.0
HOST: 192.168.1.2

请注意,结尾处需要两个连续的回车,这是HTTP协议所要求的。完成后,您可以在http://192.168.1.2/上接收页面内容。这里是一个调整,使绝对地址与GET请求

$ telnet 192.168.1.3
GET http://httpbin.org/ip HTTP/1.0
HOST: 192.168.1.2

请注意,主机是192.168.1.2,但结果返回 http://httpbin.org/ip 页面的内容,该页面是公共网络的IP地址信息。

从上面的测试过程可以看出,只要将原始请求发送到代理服务器,HTTP代理就不是一件非常复杂的事情。在无法设置HTTP代理的情况下,对于少量主机需要使用HTTP代理的情况,最简单的方法是将目标主机域名的IP指向代理服务器,通过修改主机文件即可实现。


小编推荐一个学python的学习qun 740,3222,34
无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学 习!裙内有开发工具,很多干货和技术资料分享!

Python程序中设置HTTP代理

urllib2/urllib 代理设置

urllib2是Python标准库,功能很强大,只是使用起来稍微麻烦一点。在Python 3中,urllib2不再保留,迁移到了urllib模块中。urllib2中通过ProxyHandler来设置使用代理服务器。

proxy_handler = urllib2.ProxyHandler({'http': '121.193.143.249:80'})
opener = urllib2.build_opener(proxy_handler)
r = opener.open('http://httpbin.org/ip')
print(r.read())

也可以用install_opener将配置好的opener安装到全局环境中,这样所有的urllib2.urlopen都会自动使用代理。

urllib2.install_opener(opener)
r = urllib2.urlopen('http://httpbin.org/ip')
print(r.read())

在Python 3中,使用urllib

proxy_handler = urllib.request.ProxyHandler({'http': 'http://121.193.143.249:80/'})
opener = urllib.request.build_opener(proxy_handler)
r = opener.open('http://httpbin.org/ip')
print(r.read())

requests 代理设置

requests是目前最优秀的HTTP库之一,也是我平时构造http请求时使用最多的库。它的API设计非常人性化,使用起来很容易上手。给requests设置代理很简单,只需要给proxies设置一个形如 {'http': 'x.x.x.x:8080', 'https': 'x.x.x.x:8080'} 的参数即可。其中http和https相互独立。

In [5]: requests.get('http://httpbin.org/ip', proxies={'http': '121.193.143.249:80'}).json()
Out[5]: {'origin': '121.193.143.249'}

可以直接设置session的proxies属性,省去每次请求都要带上proxies参数的麻烦。

s = requests.session()
s.proxies = {'http': '121.193.143.249:80'}
print(s.get('http://httpbin.org/ip').json())

HTTP_PROXY / HTTPS_PROXY 环境变量

urllib2 和 Requests 库都能识别 HTTP_PROXY 和 HTTPS_PROXY 环境变量,一旦检测到这些环境变量就会自动设置使用代理。这在用HTTP代理进行调试的时候非常有用,因为不用修改代码,可以随意根据环境变量来调整代理服务器的ip地址和端口。*nix中的大部分软件也都支持HTTP_PROXY环境变量识别,比如curl、wget、axel、aria2c等。

$ http_proxy=121.193.143.249:80 python -c 'import requests; print(requests.get("http://httpbin.org/ip").json())'
{u'origin': u'121.193.143.249'}
 
$ http_proxy=121.193.143.249:80 curl httpbin.org/ip
{
  "origin": "121.193.143.249"
}

在IPython交互环境中,可能经常需要临时性地调试HTTP请求,可以简单通过设置 os.environ['http_proxy'] 增加/取消HTTP代理来实现。

In [245]: os.environ['http_proxy'] = '121.193.143.249:80'
In [246]: requests.get("http://httpbin.org/ip").json()
Out[246]: {u'origin': u'121.193.143.249'}
In [249]: os.environ['http_proxy'] = ''
In [250]: requests.get("http://httpbin.org/ip").json()
Out[250]: {u'origin': u'x.x.x.x'}

MITM-Proxy

MITM 源于 Man-in-the-Middle Attack,指中间人攻击,一般在客户端和服务器之间的网络中拦截、监听和篡改数据。

mitmproxy是一款Python语言开发的开源中间人代理神器,支持SSL,支持透明代理、反向代理,支持流量录制回放,支持自定义脚本等。功能上同Windows中的Fiddler有些类似,但mitmproxy是一款console程序,没有GUI界面,不过用起来还算方便。使用mitmproxy可以很方便的过滤、拦截、修改任意经过代理的HTTP请求/响应数据包,甚至可以利用它的scripting API,编写脚本达到自动拦截修改HTTP数据的目的。

# test.py
def response(flow):
    flow.response.headers["BOOM"] = "boom!boom!boom!"

上面的脚本会在所有经过代理的Http响应包头里面加上一个名为BOOM的header。用mitmproxy -s 'test.py'命令启动mitmproxy,curl验证结果发现的确多了一个BOOM头。

$ http_proxy=localhost:8080 curl -I 'httpbin.org/get'
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 03 Nov 2016 09:02:04 GMT
Content-Type: application/json
Content-Length: 186
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
BOOM: boom!boom!boom!
...

显然,Mitmproxy脚本可以做的不止这些。使用Python强大的函数,可以派生出许多应用程序。此外,Mitmproxy还提供了强大的API,在此基础上,您可以定制一个专有的代理服务器来实现特殊的功能。

经性能测试发现,该方法的效率并不特别高。如果只用于调试,那就好了,但是当生产环境中有大量并发请求通过代理时,情况会稍差一些。我使用Twisted实现了一个简单的代理,可以向公司的内部网站添加功能,改善用户体验,并在以后与您共享。

相关文章

网友评论

    本文标题:想知道Python是如何进行HTTP代理的吗?

    本文链接:https://www.haomeiwen.com/subject/kvvduqtx.html