要实现Python的全局代理,其实就是对底层socket设置代理,而python的PySocks就可以实现修改底层socket,在连接的时候进行对目标代理服务器握手,所以从PySocks入手,通过修改PySocks代码从而实现设置代理白名单,黑名单等自由扩展
pip install PySocks
方法一:在Python目录下的\Lib\site-packages
方法二:使用PyCharm 随便创建一个py文件 import socks,然后Ctrl+鼠标左键点进去,右键选择 Show in Explorer
找到之后,复制一份socks.py到自己的项目中,修改为my_socks.py(当然也可以修改为其他的名字)
1)随便找一个空白处添加设置白名单代码
white_set = set()
def set_white_list(white_list):
global white_set
if white_list:
white_set = set(white_list)
else:
white_set.clear()
2)修改连接设置->找到socksocket类中的connect方法
找到以下代码块
if proxy_type is None:
# Treat like regular socket object
self.proxy_peername = dest_pair
super(socksocket, self).settimeout(self._timeout)
super(socksocket, self).connect((dest_addr, dest_port))
return
修改为:
if dest_addr in white_set:
print("识别到白名单")
proxy_type = None
if proxy_type is None:
# Treat like regular socket object
self.proxy_peername = dest_pair
super(socksocket, self).settimeout(self._timeout)
super(socksocket, self).connect((dest_addr, dest_port))
return
编写测试代码
my_socks.set_default_proxy(proxy_type=socks.SOCKS5, addr="****", port=****,
username="****",
password="****")
my_socks.set_white_list(['109.244.80.147'])
socket.socket = my_socks.socksocket
r = requests.get("http://pv.sohu.com/cityjson?ie=utf-8")
print("当前IP", r.text)
my_socks.set_white_list(None)
r = requests.get("http://pv.sohu.com/cityjson?ie=utf-8")
print("当前IP", r.text)