3

PAC代理网络下Python网络请求

 2 years ago
source link: http://nathanlvzs.github.io/Web-Request-Through-PAC-Proxy.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

PAC代理网络下Python网络请求

NathanLVZS   |   Friday 8 December 2017

Category:  Python  Web

  • Python

在一些公司环境中,办公机器的网络请求往往要经过PAC代理脚本的处理。

打开IE,查看Internet选项窗口中的连接标签页,点击下方的局域网设置按钮,即会弹出局域网(LAN)设置的新窗口,如果公司公司使用了PAC代理的话,则可以在该窗口中看到使用自动配置脚本是被勾选了的,地址对应的文本框即是该PAC脚本的地址,举一个虚拟的例子:http://proxy.server.com/proxy.pac 。

那么,在Python中,直接进行网络请求是行不通的,那怎么办呢?

经过搜索了解,我找到了一个包,pypac,在通常情况下,可以直接pip安装。

pip install pypac

然而,直接pip安装肯定是不行的,想想就知道了。搜索了一番,也没找到方法可以使得pip在PAC代理的情况下工作。

于是只好把pypac以及它的依赖包全都下载下来然后离线安装了。

安装完成后,没有什么意外的话,就可以在Python中进行网络请求了。

使用代码如下。

from requests.auth import HTTPProxyAuth
from pypac import PACSession

username = 'username'
password = 'password'

requester = PACSession(proxy_auth=HTTPProxyAuth(username, password))
r = requester.get('http://www.baidu.com')
print(r.status_code)

在使用过程中,发现pypac所依赖的js2py会超过最大的递归深度,通过在代码中加大了允许的递归深度最大值解决了这个问题。代码示例如下。

import sys
sys.setrecursionlimit(10000)

再后来,出现了Python IndentionError: too many levels of indentation问题。

通过查看pypac的源码,判断是由pypac所依赖的js2py根据PAC这个js脚本文件转换生成的Python结果代码中缩进层级过多造成的。由于之前没有出现过这个问题,猜测是由于PAC文件更新了,里面的条件判断语句变得更加复杂了。

由于我的网络请求目标主要是百度和必应,阅读PAC文件内容后发现并没有对这两个网站的特殊判断处理,那么可以按如下的方式解决。

  1. 下载PAC脚本文件到本地,在其判断条件过多的分支语句中,将(对自己而言)不需要的条件删除。

  2. 修改pypac包中的api.py文件中的get_pac方法,让其直接读取 修改后的PAC脚本文件 ,而不是每次被调用时都访问公司PAC文件所在的地址。

下一篇: 这个可以有

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK