之前有建过代理词,但是都不太理想,今天看到一篇文章通过ping的方式验证代理有效性,深以为然
验证代理有效性
命令:
cmd = "ping -n 3 -w 3 127.0.0.1"
在python实现通过内置subprocess包
主要用法如下:
Subprocess.Popen()可以创建一个进程,当shell参数为true时,程序通过shell来执行:
- 参数args可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。如果是序列类型,第一个元素通常是可执行文件的路径。我们也可以显式的使用executeable参数来指定可执行文件的路径。
- 参数stdin, stdout,stderr分别表示程序的标准输入、输出、错误句柄。他们可以是PIPE,文件描述符或文件对象,也可以设置为None,表示从父进程继承。
- 如果参数shell设为true,程序将通过shell来执行。
- subprocess.PIPE:在创建Popen对象时,subprocess.PIPE可以初始化stdin,stdout或stderr参数。表示与子进程通信的标准流。
- subprocess.STDOUT:创建Popen对象时,用于初始化stderr参数,表示将错误通过标准输出流输出。
cmd = f'ping -n 3 -w 3 {proxy.get("ip")}'
p = sp.Popen(cmd, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE, shell=True)
out = p.stdout.read().decode('gbk')
lose_time = re.search(r'丢失 = (\d)', out).group(1)
ave_time = re.search(r'平均 = (\d+)ms', out).group(1)
输出如下:(可通过正则获取关键属性丢包次数、延时等,或许也可以通过内置属性直接获得上述值~)
正在 Ping 112.85.129.140 具有 32 字节的数据:
来自 112.85.129.140 的回复: 字节=32 时间=21ms TTL=49
来自 112.85.129.140 的回复: 字节=32 时间=22ms TTL=49
来自 112.85.129.140 的回复: 字节=32 时间=19ms TTL=49
112.85.129.140 的 Ping 统计信息:
数据包: 已发送 = 3,已接收 = 3,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 19ms,最长 = 22ms,平均 = 20ms