Anaconda环境pandas.read_html报HTTPError服务不可用如何解决
问题根因
该HTTPError: Service Temporarily Unavailable报错并非Anaconda环境损坏,也不是目标站点真的处于不可用状态:
- ECB官网配置了反爬规则,会拦截请求头中User-Agent字段不符合常规浏览器特征的请求
- Anaconda环境内置的urllib默认携带的User-Agent标识被该规则命中,直接返回503响应;标准Python环境的默认UA未被拦截,因此完全相同的代码可正常运行。
修复方案
方案1:自定义请求头+requests发起请求(最稳定,推荐)
直接给pd.read_html传入URL字符串时,请求头是urllib自动生成的无法灵活自定义,改用requests库构造带常规浏览器UA的请求,再将响应文本传入解析即可:
- 若环境未安装requests,在Anaconda Prompt执行安装命令:
conda install requests - 替换原有代码为如下内容:
import pandas as pd import requests target_url = "https://sdw.ecb.europa.eu/quickview.do?SERIES_KEY=120.EXR.D.CHF.EUR.SP00.A" # 模拟普通桌面浏览器的请求头 request_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } response = requests.get(target_url, headers=request_headers) response.raise_for_status() # 请求异常时主动抛出错误,避免静默失败 tables = pd.read_html(response.text)
方案2:修改urllib全局请求头(无额外依赖)
如果不想引入第三方requests库,可以直接修改urllib的全局默认opener,替换默认UA,原有pd.read_html传URL的代码无需任何改动即可运行:
import pandas as pd import urllib.request # 构造自定义opener,替换UA为常规浏览器标识 custom_opener = urllib.request.build_opener() custom_opener.addheaders = [ ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") ] # 注册为全局默认opener urllib.request.install_opener(custom_opener) # 原有代码无需修改 tables = pd.read_html("https://sdw.ecb.europa.eu/quickview.do?SERIES_KEY=120.EXR.D.CHF.EUR.SP00.A")
临时方案:升级相关依赖
如果只是临时单次运行脚本,可以尝试升级pandas及解析依赖到最新版本,部分新版本pandas会调整默认请求的UA标识,可能绕过拦截:
conda update pandas lxml html5lib
注意:该方案稳定性差,站点反爬规则更新后可能再次失效,长期使用优先选择前两种显式指定请求头的方案。
内容的提问来源于stack exchange,提问作者Tripanosomagambiense
相关产品推荐
相关产品推荐

