如何检测首个可用代理并建立连接,成功后执行任务并终止程序
实现首个可用代理检测并执行操作的解决方案
你的核心需求是找到第一个能成功建立连接的代理,执行指定操作后直接退出,失败则尝试下一个代理。原代码的问题在于异常捕获范围错误,且存在无意义的无限循环,以下是修正后的实现:
修正后的代码
import requests import sys from Proxy_List_Scrapper import Scrapper, Proxy, ScrapperException ALL = 'ALL' scrapper = Scrapper(category=ALL, print_err_trace=False) data = scrapper.getProxies() test_url = 'http://api.ipify.org' # 遍历代理列表,逐个测试 for item in data.proxies: proxy_addr = f'{item.ip}:{item.port}' proxies = {"http": proxy_addr, "https": proxy_addr} try: # 添加超时避免请求挂起,超时时间可根据需求调整 page = requests.get(test_url, proxies=proxies, timeout=5) page.raise_for_status() # 捕获HTTP状态码错误(如403、500等) # 连接成功,执行你的指定操作 print(f'找到可用代理:{proxy_addr},当前IP:{page.text}') # -------------------------- # 在这里添加你的指定操作代码 # 例如:requests.get("目标网址", proxies=proxies) # -------------------------- # 执行完操作后退出程序 sys.exit(0) except (requests.exceptions.ProxyError, requests.exceptions.ConnectTimeout, requests.exceptions.HTTPError): print(f'代理 {proxy_addr} 不可用,尝试下一个') # 所有代理都测试失败时的提示 print('所有代理均无法连接')
关键修改说明
- 精准异常捕获:将try-except放到循环内部,单个代理失败时仅跳过当前代理,不中断整个遍历流程。同时扩展捕获范围,覆盖连接超时、HTTP错误等常见问题。
- 移除无限循环:原代码的
while True会重复遍历代理列表,不符合"找到首个可用代理即退出"的需求,直接遍历一次即可。 - 添加超时控制:给
requests.get设置timeout参数,避免请求因网络问题长时间挂起。 - 明确退出逻辑:成功执行操作后用
sys.exit(0)直接终止程序,无需继续遍历剩余代理。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

