Python多线程调用requests请求站点出现Connection Aborted错误如何解决
问题根源
ConnectionResetError(104, 'Connection reset by peer')报错和部分站点无返回,主要由以下几个原因导致:
- 原代码的域名列表存在语法错误:
www.ottenandpartners.co.za后缺少逗号,和下一行的www.carteplastique.fr拼接成了一个无效域名 - 仅尝试http协议请求,很多站点仅开放https端口,请求http会直接被服务端断开连接
- 未设置请求超时,网络不通时会长时间卡住甚至报错
- 未做异常捕获,单个请求出错直接导致线程崩溃
- 无并发控制,同时发起十几个请求很容易触发服务端限流或本地网络限制,导致连接被重置
修复后可直接运行的代码
import threading import requests from queue import Queue # 修复了原列表的逗号缺失问题 domain_list = [ "balajidurgaceramics.com", "km-associates.in", "www.auifs.org", "www.cadetcarebd.com", "thaygiaoquocdan.vn", "plastimedicos.com", "www.styleprojectss.com", "www.matricjackets.com", "www.ottenandpartners.co.za", "www.carteplastique.fr", "hellocodersabbir.com", "playrifa.com", "amedgroup.net", "alphatechservices.org.in", "aaqildental.com", "montessoriassociation.org.ua", "amorehairandbeauty.co.u" ] # 并发线程数,可根据自身网络情况调整,不要设置过高 THREAD_NUM = 3 q = Queue() def test(): while not q.empty(): domain = q.get() access_url = None # 先试http,失败自动尝试https for protocol in ["http://", "https://"]: try: # 超时设置为5秒,可自行调整 resp = requests.get(protocol + domain, timeout=5, allow_redirects=True) if resp.status_code < 400: access_url = resp.url break except Exception: continue # 输出结果,无法访问的站点会做统一标注 print(f"{domain}: {access_url if access_url else '无法通过http/https访问'}") q.task_done() if __name__ == "__main__": # 所有域名加入任务队列 for d in domain_list: q.put(d) # 启动指定数量的工作线程 for _ in range(THREAD_NUM): t = threading.Thread(target=test, daemon=True) t.start() # 等待所有任务执行完成 q.join()
核心优化说明
- 用队列控制并发数,避免短时间发起大量请求导致连接被重置
- 增加双协议尝试逻辑,http访问失败自动降级到https
- 统一捕获所有请求异常,单个站点访问失败不会影响其他任务执行
- 增加超时限制,避免无意义的长时间等待
- 输出结果和域名绑定,不会出现结果和域名对应不上的问题
- 修复了原列表的语法错误,避免无效域名导致的报错
- 替换了原代码中用关键字
list做变量名的错误写法,避免语法隐患
内容的提问来源于stack exchange,提问作者Phenom
相关产品推荐
相关产品推荐

