除我的笔记本电脑外,Urllib按要求下载文件

时间:2012-07-31 00:38:22

标签: python download urllib

我有一个Python脚本,可以根据日期,时间和小时数从NOAA网站下载GRIB文件(天气预报数据),以便提前预测。基本上,Python将一个大的URL请求拼凑在一起并将其发布到NOAA网站。这在学校的计算机上运行良好,并且它对于一些以前帮助我编写代码的堆栈溢出程序非常有用。但是,同样精确的脚本在我的计算机上使用Python的10次中有9次失败,即使我将Python打印出来并将其复制到Firefox中,它每次都能正常工作。将库更改为urllib2不会改变任何内容。

所以我可以说以下内容:不知怎的,如果我使用的是我的电脑,urllib无法获取我想要的数据,但脚本在其他任何地方都能正常工作。 Urllib可以毫不费力地从我的计算机上的其他网站上删除HTML,但不知何故,这个特定的下载给它带来了麻烦。

当我尝试在家中运行脚本时,我正在运行Ubuntu精确并在具有无线连接的笔记本电脑上使用Python 2.7.3。我已经在有线电脑上用ubuntu测试了它,并且它每次都有效(也在fedora上测试过,也在那里工作)。

请告诉我一些诊断我可以做出来弄清楚为什么urllib和我的电脑不能玩得很好。谢谢你;这个问题阻碍了下一代高空气球的发射。

这是90%的时间告诉我的事情:

Traceback (most recent call last):
File "/home/dantayaga/bovine_aerospace/dev/grib_get.py", line 67, in <module>
webf=urllib.urlopen(griburl, data='POST')
File "/usr/lib/python2.7/urllib.py", line 88, in urlopen
return opener.open(url, data)
File "/usr/lib/python2.7/urllib.py", line 209, in open
return getattr(self, name)(url, data)
File "/usr/lib/python2.7/urllib.py", line 344, in open_http
h.endheaders(data)
File "/usr/lib/python2.7/httplib.py", line 954, in endheaders
self._send_output(message_body)
File "/usr/lib/python2.7/httplib.py", line 814, in _send_output
self.send(msg)
File "/usr/lib/python2.7/httplib.py", line 776, in send
self.connect()
File "/usr/lib/python2.7/httplib.py", line 757, in connect
self.timeout, self.source_address)
File "/usr/lib/python2.7/socket.py", line 553, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
IOError: [Errno socket error] [Errno -2] Name or service not known

这是我正在使用的代码(感谢samy.vilar等人提高了pythonicity)。请注意,您必须输入今天的日期和00,06,12或18(格林威治标准时间)的预测时间,否则您可能会得到404未找到。保持预测时间不变。

获取GRIB文件

import urllib
#import os

#os.environ['http_proxy']='' #Doesn't seem to help!

forecast_time='06' #What time the forecast is (00, 06, 12, 18)
forecast_hours='12' #How many hours ahead to forecast (2 or 3 digits)
forecast_date='20120720' #What date the forecast is for yyyymmdd

top_lat=90 #Top of bounding box (North)
bottom_lat=-90 #Bottom of bounding box (South)
left_lon=-90 #Left of bounding box (West)
right_lon=90 #Right of bounding box (East)

griburl='http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_hd.pl?'
griburl=griburl+'file=gfs.t'+str(forecast_time)+'z.mastergrb2f'
griburl=griburl+forecast_hours

#Select atmospheric levels

griburl=griburl+'&lev_1000_mb=on'  #1000 mb level
griburl=griburl+'&lev_975_mb=on'   #975 mb level
griburl=griburl+'&lev_950_mb=on'   #950 mb level
griburl=griburl+'&lev_925_mb=on'   #925 mb level
griburl=griburl+'&lev_900_mb=on'   #900 mb level
griburl=griburl+'&lev_850_mb=on'   #850 mb level
griburl=griburl+'&lev_800_mb=on'   #800 mb level
griburl=griburl+'&lev_750_mb=on'   #750 mb level
griburl=griburl+'&lev_700_mb=on'   #700 mb level
griburl=griburl+'&lev_650_mb=on'   #650 mb level
griburl=griburl+'&lev_600_mb=on'   #600 mb level
griburl=griburl+'&lev_550_mb=on'   #550 mb level
griburl=griburl+'&lev_500_mb=on'   #500 mb level
griburl=griburl+'&lev_450_mb=on'   #450 mb level
griburl=griburl+'&lev_400_mb=on'   #400 mb level
griburl=griburl+'&lev_350_mb=on'   #350 mb level
griburl=griburl+'&lev_300_mb=on'   #300 mb level
griburl=griburl+'&lev_250_mb=on'   #250 mb level
griburl=griburl+'&lev_200_mb=on'   #200 mb level
griburl=griburl+'&lev_150_mb=on'   #150 mb level
griburl=griburl+'&lev_100_mb=on'   #100 mb level
griburl=griburl+'&lev_70_mb=on'    #70 mb level
griburl=griburl+'&lev_30_mb=on'    #30 mb level
griburl=griburl+'&lev_20_mb=on'    #20 mb level
griburl=griburl+'&lev_10_mb=on'    #10 mb level

#Select variables

griburl=griburl+'&var_HGT=on'  #Height (geopotential m)
griburl=griburl+'&var_RH=on'  #Relative humidity (%)
griburl=griburl+'&var_TMP=on' #Temperature (K)
griburl=griburl+'&var_UGRD=on' #East-West component of wind (m/s)
griburl=griburl+'&var_VGRD=on' #North-South component of wind (m/s)
griburl=griburl+'&var_VVEL=on' #Vertical Windspeed (Pa/s)

#Select bounding box

griburl=griburl+'leftlon='+str(left_lon)
griburl=griburl+'rightlon='+str(right_lon)
griburl=griburl+'toplat='+str(top_lat)
griburl=griburl+'bottomlat='+str(bottom_lat)

#Select date and time

griburl=griburl+'&dir=%2Fgfs.'+forecast_date+forecast_time+'%2Fmaster'
print(griburl)
print('Downloading GRIB file for date '+forecast_date+' time ' +forecast_time + ', forecasting '+forecast_hours+' hours ahead...')
webf=urllib.urlopen(griburl, data='POST')
print("Download complete.  Saving...")
local_filename=forecast_date+'_'+forecast_time+'_'+forecast_hours+'.grib'
localf=open(local_filename, 'wb')
localf.write(webf.read())
print('Requested grib data written to file '+local_filename)

2 个答案:

答案 0 :(得分:1)

IOError: [Errno socket error] [Errno -2] Name or service not known

此异常表示您的笔记本电脑无法将主机名解析为IP地址。 DNS查找由套接字库处理,这与您使用urllib还是urllib2(或其他任何内容)无关。

您需要查看您的网络设置,尤其是您的DNS服务器。可能是Firefox配置为使用代理,在这种情况下,它将DNS查找委派给代理。

你没有遇到其他网站的问题,这很奇怪;我无法解释为什么使用urllib的HTML抓取适用于其他网站(可能是为这些脚本启用了代理?),但您遇到的例外肯定与DNS有关。

如果您确实发现Firefox正在使用代理,请尝试将您的脚本设置为使用相同的代理。一种简单的方法是调用你的Python脚本:

http_proxy=http://proxy:1234 python grib_get.py

或者,出于诊断目的,您可以暂时将远程服务器的IP地址硬编码到您的URL中,即

griburl='http://140.90.33.62/cgi-bin/filter_gfs_hd.pl?'

答案 1 :(得分:0)

我想知道它是否是一个内存问题,内存不足,所以它被分页到磁盘,减慢了太多。

无论如何,在您实际下载任何内容之前,您正在打印“下载完成。保存...”。

请改为尝试:

print('Downloading GRIB file for date '+forecast_date+' time ' +forecast_time + ', forecasting '+forecast_hours+' hours ahead...')
local_filename=forecast_date+'_'+forecast_time+'_'+forecast_hours+'.grib'
webf=urllib.urlopen(griburl, data='POST')
localf=open(local_filename, 'wb')
BLOCK_SIZE = 4096
while True:
    block = webf.read(BLOCK_SIZE)
    if not block:
        break
    localf.write(block)
localf.close()
webf.close()
print("Download complete.  Saving...")