requests 的 proxy 设置

直接使用系统设置

发现 requests 会直接使用 macOS 系统的 proxy 设置。但是很多时候都不想这么做,所以会通过代码来配置。

程序中设置

单次请求的设置:

import requests

proxies = {'http': 'http://localhost:8888', 'https': 'http://localhost:8888'}

requests.get('http://example.org', proxies=proxies)

使用 session 时候的持久设置:

import requests

s = requests.Session()
s.proxies = {'http': 'http://localhost:8888', 'https': 'http://localhost:8888'}

requests.get('http://example.org')

需要注意的是,单次的 requests 请求的设置可以覆盖 session 中的设置,参考 requests.sessions 的源码

参考:

Proxies in Advanced Usage

SSL 证书设置

比如上一步设置的 HTTPS Proxy 是想用 Charles 来抓包的,想用 Charles 解析 HTTPS 的请求就必须把 Charles 放在中间,客户端相信 Charles 签发的证书并和 Charles 之间 HTTPS 通信。Charles 再把自己当做一个客户端去和服务器 HTTPS 通信。

这里要做的就是让 requests 来信任 Charles 生成的 CA。这个关键的一步 requests 却不能读取系统的设置了,有点伤心。那手动好了。

类似上一步中的 proxies,session、request 中还有 verifycert 参数,前者默认为 True 表示需要验证服务器的 SSL 证书,手动设置成 False 可行但是会不停的报 Warning,Warning 不太好关掉。

verify 可以设置成证书的地址,发现证书使用文本格式的 PEM 是可用的。

实例如下:

import requests

proxies = {'http': 'http://localhost:8888', 'https': 'http://localhost:8888'}

requests.get('http://example.org', proxies=proxies, verify='/path-to/charles-ssl-proxying-certificate.pem')
import requests

s = requests.Session()
s.proxies = {'http': 'http://localhost:8888', 'https': 'http://localhost:8888'}
s.verify='/path-to/charles-ssl-proxying-certificate.pem'

requests.get('http://example.org')

参考:


常伟佳
310 声望16 粉丝

引用和评论

0 条评论