返回顶部
首页 > 资讯 > 后端开发 > Python >Python程序中设置HTTP代理
  • 384
分享到

Python程序中设置HTTP代理

程序PythonHTTP 2022-06-04 18:06:28 384人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

0x00 前言 大家对Http代理应该都非常熟悉,它在很多方面都有着极为广泛的应用。HTTP代理分为正向代理和反向代理两种,后者一般用于将防火墙后面的服务提供给用户访问或者进行负载均衡,典型的有N

0x00 前言

大家对Http代理应该都非常熟悉,它在很多方面都有着极为广泛的应用。HTTP代理分为正向代理和反向代理两种,后者一般用于将防火墙后面的服务提供给用户访问或者进行负载均衡,典型的有Nginx、HAProxy等。本文所讨论的是正向代理。

HTTP代理最常见的用途是用于网络共享、网络加速和网络限制突破等。此外,HTTP代理也常用于WEB应用调试、Android/iOS APP 中所调用的Web api监控和分析,目前的知名软件有Fiddler、Charles、Burp Suite和mitmproxy等。HTTP代理还可用于请求/响应内容修改,在不改变服务端的情况下为Web应用增加额外的功能或者改变应用行为等。

0x01 HTTP代理是什么

HTTP代理本质上是一个Web应用,它和其他普通Web应用没有根本区别。HTTP代理收到请求后,根据Header中Host字段的主机名和Get/POST请求地址综合判断目标主机,建立新的HTTP请求并转发请求数据,并将收到的响应数据转发给客户端。

如果请求地址是绝对地址,HTTP代理采用该地址中的Host,否则使用Header中的HOST字段。做一个简单测试,假设网络环境如下:


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

注意这里同样设置了HOST为192.168.1.2,但运行结果却返回了 http://httpbin.org/ip 页面的内容,也就是公网IP地址信息。

从上面的测试过程可以看出,HTTP代理并不是什么很复杂的东西,只要将原始请求发送到代理服务器即可。在无法设置HTTP代理的情况下,对于少量Host需要走HTTP代理的场景来说,最简单的方式就是将目标Host域名的IP指向代理服务器,可以采取修改hosts文件的方式来实现。

0x02 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())

0x03 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'}

0x04 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,在这些API的基础上,完全可以自己定制一个实现了特殊功能的专属代理服务器。

经过性能测试,发现mitmproxy的效率并不是特别高。如果只是用于调试目的那还好,但如果要用到生产环境,有大量并发请求通过代理的时候,性能还是稍微差点。我用twisted实现了一个简单的proxy,用于给公司内部网站增加功能、改善用户体验,以后有机会再和大家分享。

--结束END--

本文标题: Python程序中设置HTTP代理

本文链接: https://lsjlt.com/news/14047.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python程序中设置HTTP代理
    0x00 前言 大家对HTTP代理应该都非常熟悉,它在很多方面都有着极为广泛的应用。HTTP代理分为正向代理和反向代理两种,后者一般用于将防火墙后面的服务提供给用户访问或者进行负载均衡,典型的有N...
    99+
    2022-06-04
    程序 Python HTTP
  • 如何在 PHP 中设置 HTTP 代理设置
    在 PHP 中设置 HTTP 代理设置可以通过修改 `stream_context` 的参数来实现。下面是一个示例代码:```php...
    99+
    2023-09-26
    PHP
  • 如何设置HTTP代理
    这篇文章给大家介绍如何设置HTTP代理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、IP地址端口设置(1)打开浏览器,找到工具/互联网选项。(2)如果是拨号用户,可以选择网络连接-设置,填写IP地址和端口。如果是局...
    99+
    2023-06-14
  • HTTP代理如何设置
    HTTP代理如何设置?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。IP地址端口设置。(1)打开浏览器,找到工具/互联网选项。(2)如果是拨号用户,可以选择网络连接-设置,填写I...
    99+
    2023-06-15
  • java http请求设置代理 Proxy
    HttpURLConnection、HttpClient设置代理Proxy 有如下一种需求,原本A要给C发送请求,但是因为网络原因,需要借助B才能实现,所以由原本的A->C变成了A->B->C。 这种...
    99+
    2023-09-10
    java http 服务器
  • 怎么设置HTTP代理服务器
    这期内容当中小编将会给大家带来有关怎么设置HTTP代理服务器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。打开浏览器,找到工具按钮。如果你的工具栏是隐藏的,你可以用Alt键呼出。步骤为工具-interne...
    99+
    2023-06-14
  • Python代理设置
    def test3():     url = "http://www.ip.cn"     proxy_handler = urllib2.ProxyHandler({'http' : 'http://username:password@...
    99+
    2023-01-31
    Python
  • 怎么在电脑上设置HTTP代理
    这篇文章给大家分享的是有关怎么在电脑上设置HTTP代理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。假定代理服务的IP为192.168.0.1,端口为1080。打开网页,选择者地址栏上方的工具选项,在下面的菜单中...
    99+
    2023-06-14
  • Python中怎么设置requests代理
    这期内容当中小编将会给大家带来有关Python中怎么设置requests代理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。requests设置代理import requestsproxies&n...
    99+
    2023-06-02
  • 如何在 ASP 程序中设置 HTTP 容器的参数?
    ASP 程序是一种常见的网站开发技术,HTTP 容器是 ASP 程序的核心组件之一。HTTP 容器是负责接收和处理 HTTP 请求的组件,因此设置 HTTP 容器的参数对于 ASP 程序的性能和安全非常重要。本文将介绍如何在 ASP 程序中...
    99+
    2023-06-03
    日志 http 容器
  • Android Studio配置HTTP代理
    Android Studio配置HTTP代理 在使用Android Studio进行开发时,有时我们需要通过HTTP代理来访问互联网,例如下载库、插件或更新工具。本文将介绍如何在Android Stu...
    99+
    2023-09-24
    android studio http android Android
  • 国外http代理服务器地址怎么设置
    1. 打开浏览器,进入浏览器的设置页面。2. 找到网络设置或代理设置选项。3. 在代理设置中,选择手动设置代理服务器。4. 在代理服...
    99+
    2023-06-07
    http代理服务器地址 代理服务器 服务器
  • Android Studio代理设置教程
    Android Studio代理设置教程 在开发Android应用程序时,我们经常需要使用Android Studio来编写、调试和构建我们的代码。然而,有时候我们的开发环境可能位于一个受限制的网络中...
    99+
    2023-09-10
    android studio android ide Android
  • 在 go echo 中测试 http 处理程序
    偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《在 go echo 中测试 http 处理程序》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下...
    99+
    2024-04-04
  • JS中如何设置事件处理程序
    这篇文章主要介绍JS中如何设置事件处理程序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!第一种方式(HTML标签属性):<input type="butto...
    99+
    2024-04-02
  • Linux设置wget下载http/https代理的方法有哪些
    这篇文章主要讲解了“Linux设置wget下载http/https代理的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux设置wget下载http/https代理的方法有哪些...
    99+
    2023-06-13
  • python 使用socks5 设置全局代理
    要设置全局代理,可以使用 `socks` 库来实现。下面是一个示例代码,可以将全局代理设置为 SOCKS5 代理:```python...
    99+
    2023-09-16
    python
  • Node.js中怎么设置HTTP头
    Node.js中怎么设置HTTP头,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。server.js//basic server的配置...
    99+
    2024-04-02
  • Android Studio 配置网络代理(HTTP Proxy)
    Android Studio 配置网络代理(HTTP Proxy) 近年来,移动应用开发领域蓬勃发展,Android Studio作为一款功能强大的集成开发环境备受开发者青睐。然而,在某些情况下,我们...
    99+
    2023-09-24
    网络 android studio http Android
  • Nginx http反向代理如何配置
    本篇内容主要讲解“Nginx http反向代理如何配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nginx http反向代理如何配置”吧!概述什么是 NginxNginx (engine x...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作