使用wget下载英国新冠CSV数据遇HTTP 308错误,求解决方案
解决wget下载英国新冠疫情数据时的HTTP 308永久重定向错误
问题描述
我是Python新手,正在进行英国CV-19疫情爆发建模工作,目前编写程序自动下载英国政府最新死亡统计数据。现有代码如下:
import wget url = "https://coronavirus.data.gov.uk/downloads/csv/coronavirus-cases_latest.csv" # wget.download(url, 'C:/Users/Moshe/Downloads/Covid_19_uk_timeseries.csv')
在PyCharm中运行该代码时,出现如下报错信息:
C:\Users\Moshe\PycharmProjects\HelloWorld\venv\Scripts\python.exe C:/Users/Moshe/.PyCharmCE2019.1/config/scratches/Get_CV19_UK_stats.py Traceback (most recent call last): File "C:/Users/Moshe/.PyCharmCE2019.1/config/scratches/Get_CV19_UK_stats.py", line 6, in <module> wget.download(url, 'C:/Users/Moshe/Downloads/Covid_19_uk_timeseries.csv') File "C:\Users\Moshe\PycharmProjects\HelloWorld\venv\lib\site-packages\wget.py", line 526, in download (tmpfile, headers) = ulib.urlretrieve(binurl, tmpfile, callback) File "C:\Users\Moshe\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 247, in urlretrieve with contextlib.closing(urlopen(url, data)) as fp: File "C:\Users\Moshe\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 222, in urlopen return opener.open(url, data, timeout) File "C:\Users\Moshe\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 531, in open response = meth(req, response) File "C:\Users\Moshe\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 641, in http_response 'http', request, response, code, msg, hdrs) File "C:\Users\Moshe\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 569, in error return self._call_chain(*args) File "C:\Users\Moshe\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 503, in _call_chain result = func(*args) File "C:\Users\Moshe\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 649, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 308: Permanent Redirect Process finished with exit code 1
目标文件可在英国政府新冠数据页面获取。请问该代码为何无法运行?需要如何修改?
问题原因
HTTP Error 308: Permanent Redirect 表示你请求的URL已经被永久迁移到了新地址,而你使用的wget库的download方法默认不会自动跟随这类重定向;另外注意,你代码里的URL指向的是病例数据CSV,但你提到要下载的是死亡统计数据,这也是一个需要修正的小偏差。
解决方案
方案1:使用requests库(推荐,自动处理重定向)
requests是Python中更易用的HTTP请求库,默认会自动跟随所有3xx系列的重定向,代码实现更简洁:
首先确保你已经安装了requests:
pip install requests
然后替换代码为:
import requests # 替换为官方提供的死亡统计数据CSV URL(可从数据页面获取最新链接) url = "https://coronavirus.data.gov.uk/downloads/csv/coronavirus-deaths_latest.csv" save_path = 'C:/Users/Moshe/Downloads/Covid_19_uk_deaths_timeseries.csv' # 发送请求并允许自动重定向 response = requests.get(url, allow_redirects=True) # 将下载内容写入本地文件 with open(save_path, 'wb') as file: file.write(response.content) print("死亡统计数据下载完成!")
方案2:继续使用wget,手动处理重定向
如果你坚持要用wget,可以先通过urllib获取重定向后的真实URL,再用wget下载:
import wget import urllib.request original_url = "https://coronavirus.data.gov.uk/downloads/csv/coronavirus-cases_latest.csv" # 获取重定向后的真实下载链接 with urllib.request.urlopen(original_url) as response: real_download_url = response.geturl() # 使用真实URL执行下载 wget.download(real_download_url, 'C:/Users/Moshe/Downloads/Covid_19_uk_timeseries.csv')
额外提示
- 英国政府的新冠数据CSV链接可能会不定期更新,建议定期从官方数据页面确认最新的下载链接,避免再次出现URL失效的问题。
- 确认你要下载的是死亡数据还是病例数据,不要混淆对应的URL,官方页面里会分别提供不同数据的下载入口。
内容的提问来源于stack exchange,提问作者Abijah
相关产品推荐
相关产品推荐

