You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:34:45