0

我正在尝试从 NASA 服务器(URL )下载文件(大约 1 - 1.5MB/文件) ,但无济于事!我用 urllib2 尝试了一些东西并遇到了两个结果:

  1. 我在我的机器上创建了一个只有 ~200KB 的新文件,其中没有任何内容
  2. 我在我的机器上创建了一个 1.5MB 的文件,其中没有任何内容!

“里面什么都没有”我的意思是当我打开文件时(这些是 hdf5 文件,所以我在 hdfView 中打开它们)我看不到任何层次结构......从字面上看,它看起来像一个空的 h5 文件。但是,当我在文本编辑器中打开文件时,我可以看到那里有一些东西(它是二进制的,所以在文本中它看起来像......嗯,二进制)。

我认为我正在适当地使用 urllib2,尽管我以前从未成功使用过 urllib2。您能否评论一下我所做的是否正确,并提出更好的建议?

from urllib2 import Request, urlopen, URLError, HTTPError
base_url = 'http://avdc.gsfc.nasa.gov/index.php?site=1480884223&id=40&go=list&path=%2FH2O%2F/2010'
file_name = 'download_2.php?site=1480884223&id=40&go=download&path=%2FH2O%2F2010&file=MLS-Aura_L2GP-H2O_v03-31-c01_2010d360.he5'


url = base_url + file_name
req = Request(url)

# Open the url
try:
    f = urlopen(req)
    print "downloading " + url

    # Open our local file for writing
    local_file = open('test.he5', "w" + file_mode)
    #Write to our local file
    local_file.write(f.read())
    local_file.close()

except HTTPError, e:
    print "HTTP Error:",e.code , url
except URLError, e:
    print "URL Error:",e.reason , url

我从这里得到了这个脚本(这似乎是最接近工作的)。
我不确定 file_name 应该是什么。我查看了存档的页面源信息并提取了其中列出的文件名(与网页上显示的不同),这样做会产生 1.5MB 的文件,在 hdfview 中没有显示任何内容。

4

1 回答 1

1

您正在创建一个无效的网址:

base_url = 'http://avdc.gsfc.nasa.gov/index.php?site=1480884223&id=40&go=list&path=%2FH2O%2F/2010'
file_name = 'download_2.php?site=1480884223&id=40&go=download&path=%2FH2O%2F2010&file=MLS-Aura_L2GP-H2O_v03-31-c01_2010d360.he5'

url = base_url + file_name

你可能的意思是:

base_url = 'http://avdc.gsfc.nasa.gov/'
file_name = 'download_2.php?site=1480884223&id=40&go=download&path=%2FH2O%2F2010&file=MLS-Aura_L2GP-H2O_v03-31-c01_2010d360.he5'

下载大文件时,最好使用从文件句柄到文件句柄的缓冲副本:

import shutil

# ...
f = urlopen(req)
with open('test.he5', "w" + file_mode) as local_file:
    shutil.copyfileobj(f, local_file)

.copyfileobj将有效地从打开的 urllib 连接加载并写入打开的local_file文件句柄。请注意with语句,当下面的代码块结束时,它会自动为您关闭文件。

于 2012-10-26T13:15:30.250 回答