Python批量检测URL报ConnectionResetError 10054错误如何解决
修复批量URL检测ConnectionResetError问题
报错原因
ConnectionResetError报错是远程服务器主动强制断开了连接,触发原因通常包含几种情况:短时间内请求频率过高被服务器限流、部分目标站点服务异常、请求缺少必要标识被服务器拦截、当前代码未做异常捕获,单个URL请求失败就直接中断整个批量任务。
修复方案
- 新增异常捕获逻辑,单个URL请求出错时跳过该条记录,不终止整体任务
- 增加失败重试机制,针对临时网络波动、限流等场景自动重试,提高检测准确率
- 限制请求频率,每次请求后增加短暂延迟,避免触发站点反爬限流规则
- 完善请求头字段,添加User-Agent模拟正常浏览器请求,降低被拦截概率
- 兼容HTTPS协议,根据URL的scheme自动选择HTTP/HTTPS连接,避免协议不匹配导致的连接错误
修改后完整代码
import time import http.client from urllib.parse import urlparse def checkUrl(url, max_retry=3): # 重试机制,最多重试max_retry次 for retry_cnt in range(max_retry): try: p = urlparse(url) # 兼容HTTPS和HTTP if p.scheme == 'https': conn = http.client.HTTPSConnection(p.netloc, timeout=10) else: conn = http.client.HTTPConnection(p.netloc, timeout=10) # 添加请求头模拟浏览器 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } conn.request('HEAD', p.path if p.path else '/', headers=headers) resp = conn.getresponse() conn.close() return resp.status < 400 except Exception as e: # 出错后等待1秒再重试 time.sleep(1) continue # 重试全部失败返回False return False all_urls = URL.objects.all() for u in all_urls: my_url = u.url result = checkUrl(my_url) print(f"{my_url} 检测结果: {result}") # 每次请求后延迟0.5秒,可根据实际情况调整 time.sleep(0.5)
可选优化点
- 可以将检测结果存入URL模型对应的字段,不用只打印输出
- 可以引入多线程提高检测效率,同时配合限流规则避免被封
- 可以针对不同的错误类型做分类统计,方便后续分析异常原因
内容的提问来源于stack exchange,提问作者Jasmeet Pabla
相关产品推荐
相关产品推荐

