使用 python 从 Internet 下载文件

Downloading a file from the internet with python

我正在尝试通过此 link 从网站检索 CSV 数据。

手动下载时,您会得到 synop.201708.csv.gz,它实际上是一个错误命名为 .gz 的 csv,它的大小为 2233KB

当运行此代码时:

import urllib

file_date = '201708'
file_url = "https://donneespubliques.meteofrance.fr/donnees_libres/Txt/Synop/Archive/synop.{}.csv.gz".format(file_date)
output_file_name = "{}.csv.gz".format(file_date)

print "downloading {} to {}".format(file_url, output_file_name)
urllib.urlretrieve (file_url, output_file_name)

我得到一个损坏的 ~361Kb 文件

知道为什么吗?

正如 pvg 所说:

urllib.urlretrieve下载的文件是压缩包,不是csv文件,一切正常

我以为我应该得到一个名为 .gz 的 csv,因为当我通过浏览器 (chrome) 手动下载它时,它会在不告诉我的情况下解压缩它,并且它保留了解压缩的文件名字.gz

似乎正在发生的事情是 MétéoFrance 网站滥用了 Content-Encoding header。该网站报告说它正在为您提供一个 gzip 文件 (Content-Type: application/x-gzip),并且正在将其编码为 gzip 格式以便传输 (Content-Encoding: x-gzip)。还说该页面是一个附件,应该以它的正常名称保存(Content-Disposition: attachment)

在真空中,这将是有意义的(在某种程度上;压缩已经压缩的文件大多是无用的):服务器提供 gzip 文件并再次压缩它以进行传输。收到后,您的浏览器会取消传输压缩并保存原始 gzip 文件。在这里,它解压缩了流,但由于它没有再次压缩,所以它没有按预期工作。