Python 判断代理ip是否可用
from concurrent.futures import ThreadPoolExecutor, as_completed
import socket
# 判断ip_port是否能够连接上
def try_connection(ip_port):
s = socket.socket()
# 等待最大时间设定为5秒(可改小)
s.settimeout(5)
# 尝试连接目标ip_port
try:
s.connect(ip_port)
# 捕获连接超时错误并生成超时info
except socket.timeout as e:
info = ip_port[0] + ':' + str(ip_port[1]) + ' 超时'
# 捕获连接错误并生成错误info
except socket.error as e:
info = ip_port[0] + ':' + str(ip_port[1]) + ' ' + str(e)
# 确认ip_port可用,生成可用info
else:
info = ip_port[0] + ':' + str(ip_port[1]) + ' 可用'
# 最后关闭socket对象并返回info
finally:
s.close()
return info
# 生成多线程池对象,最大线程数为10(可调大)
executor = ThreadPoolExecutor(max_workers=10)
# 读取文件中的ip_port(每行一个),并打开信息文件备用
with open('server.txt','r') as fin, open('connection.txt','w') as fout:
servers = []
for addr in fin:
ip, port = addr.split(':')
port = int(port)
# 向servers列表添加读取出的ip_port
servers.append((ip, port))
# 进行多线程访问并验证
for result in executor.map(try_connection, servers):
# 结果并写入文件
print(result)
fout.write(result + '\n')