使用Python3从URL下载CSV文件时遇Connection Error求助
解决Python请求CNAC网站CSV文件时的ConnectionError问题
我来帮你排查这个连接错误的问题,这类ConnectionError: Max retries exceeded通常是网络连通性问题或者请求被网站拦截导致的,咱们一步步来解决:
第一步:先排查基础网络问题
- 先手动在浏览器里访问目标URL
http://www.cnac.ca/data/COCodeStatus_NPA204.csv,看看能不能正常下载文件。如果浏览器也打不开,那大概率是网站本身不可用或者你的网络环境限制访问该域名。 - 用命令行测试连通性:执行
ping www.cnac.ca看是否能ping通;或者用curl -I http://www.cnac.ca/data/COCodeStatus_NPA204.csv查看服务器返回的状态码,比如404是文件不存在,503是服务器维护,这些都会导致请求失败。
第二步:优化requests请求参数
如果网络本身能访问,那咱们调整请求配置,提高成功率:
1. 添加超时限制,避免无限等待
原代码没有设置超时,可能会一直卡在请求里。给get请求加上超时参数,比如10秒:
requests.get(url, stream=True, timeout=10)
2. 加入重试机制,应对临时网络波动
有些时候是临时网络波动导致的失败,咱们可以给requests添加自动重试策略:
import requests from contextlib import closing import csv from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry url = "http://www.cnac.ca/data/COCodeStatus_NPA204.csv" # 构建带重试的session session = requests.Session() # 设置重试规则:最多重试3次,间隔1/2/4秒,遇到5xx等错误重试 retry_strategy = Retry( total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504] ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount("http://", adapter) session.mount("https://", adapter) try: with closing(session.get(url, stream=True, timeout=10)) as r: r.raise_for_status() # 主动抛出HTTP错误(比如404、500) # 加上decode_unicode=True避免编码问题 reader = csv.reader(r.iter_lines(decode_unicode=True), delimiter=',', quotechar='"') for row in reader: print(row) except requests.exceptions.RequestException as e: print(f"请求失败:{str(e)}")
3. 模拟浏览器请求头,绕过反爬拦截
很多网站会拦截非浏览器发起的请求,咱们给请求加上浏览器的User-Agent:
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" } # 在get请求里添加headers参数 with closing(session.get(url, stream=True, timeout=10, headers=headers)) as r: # 后续代码不变
4. 考虑使用代理(如果网络环境受限)
如果你的网络无法直接访问该域名(比如地区限制、公司内网),可以设置代理:
proxies = { "http": "http://你的代理地址:端口", "https": "http://你的代理地址:端口" } # 在get请求里添加proxies参数 with closing(session.get(url, stream=True, timeout=10, headers=headers, proxies=proxies)) as r: # 后续代码不变
总结
按照这个顺序排查:先确认网络和网站是否正常,再逐步添加超时、重试、请求头,最后考虑代理,应该能解决这个连接错误问题。
内容的提问来源于stack exchange,提问作者Angela Ju
相关产品推荐
相关产品推荐

