Python脚本访问离线网站报requests.exceptions.ConnectionError错误如何解决
错误原因
你遇到的requests.exceptions.ConnectionError: HTTPConnectionPool报错是目标站点离线、网络不通、域名解析失败等连接异常场景下,requests库抛出的未捕获异常,会直接终止整个脚本运行,导致后续的下载任务无法执行。
修复方案
核心是通过异常捕获机制处理连接失败场景,单个链接下载失败时仅跳过该任务、不影响整体运行,同时可以增加超时、重试逻辑提升脚本健壮性。
修改后的完整代码
# *- coding: utf-8 -*- import requests import os.path from requests.exceptions import ConnectionError, Timeout, RequestException # 可自定义配置:单个请求的超时时间(秒),请求失败最多重试次数 REQUEST_TIMEOUT = 10 MAX_RETRY = 2 def download_url(url): print("downloading: ", url) # 重试逻辑 retry_count = 0 while retry_count < MAX_RETRY: try: r = requests.get(url, stream=True, timeout=REQUEST_TIMEOUT) # 请求成功直接跳出重试循环 break except (ConnectionError, Timeout) as e: retry_count += 1 print(f"下载{url}失败,第{retry_count}次重试,错误信息:{str(e)}") except RequestException as e: # 其他请求类错误直接放弃当前链接 print(f"下载{url}遇到未知请求错误,跳过该任务,错误信息:{str(e)}") return else: # 重试次数耗尽仍失败 print(f"下载{url}重试{MAX_RETRY}次后仍失败,跳过该任务") return # 原有正常下载逻辑优化 file_name_start_pos = url.rfind(".txt") + 1 file_name = url[file_name_start_pos:] if r.status_code == requests.codes.ok: if not os.path.isfile("data_file.txt"): with open("data_file.txt","w") as f: pass with open("data_file.txt", 'ab') as f: f.write(bytes(f"\n\n----------- {file_name} -----------\n\n",'utf-8')) for data in r: f.write(data) else: print(f"下载{url}返回状态码异常:{r.status_code},跳过该任务") download_url("https://wordpress.org/plugins/readme.txt") download_url("https://wolfstudios.nl/readme.txt") download_url("http://download.ni.com/support/softlib/visa/NI-VISA/17.0/Linux/README.txt")
核心改动说明
- 新增了精确的异常捕获逻辑:分别处理连接错误、超时错误、其他未知请求错误,所有错误场景都不会终止脚本,只会跳过当前失败的下载任务
- 新增了超时设置:避免请求长时间无响应卡住整个脚本
- 新增了可选的重试机制:应对临时网络波动、站点瞬时不可用的场景,提升下载成功率
- 新增了状态码异常判断:如果站点返回404、500等错误状态码时也会跳过,避免后续写入无效内容
- 优化了文件创建逻辑:用
with语句改写初始文件创建逻辑,避免文件操作资源泄漏
内容的提问来源于stack exchange,提问作者Robby
相关产品推荐
相关产品推荐

