Urllib下载文件,除了在我的笔记本电脑上

2024-04-24 13:09:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python脚本,从NOAA网站下载一个GRIB文件(天气预报数据),它基于一个日期、时间和时间来预测未来。基本上,Python将一个大的URL请求拼凑在一起,并将其发布到NOAA网站上。这在学校的电脑上很好用,对以前帮助我编写代码的堆栈溢出器也很有用。然而,在我的电脑上使用Python时,同样的脚本10次中有9次失败,尽管当我让Python打印出URL并将其复制到Firefox中时,它每次都能正常工作。将库更改为urllib2不会更改任何内容。在

所以我可以这样说:如果我使用我的计算机,不知何故urllib无法获得我想要的数据,但是脚本在其他地方都可以正常工作。Urllib可以从我电脑上的其他网站上抓取HTML而没有任何问题,但不知何故这个特定的下载给它带来了麻烦。在

我正在运行ubuntuprecise,在家里运行脚本时,我在一台有无线连接的笔记本电脑上使用python2.7.3。我用ubuntuprecise在一台有线电脑上测试过,每次都能用(也在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

这是我使用的代码萨米·维拉等,以改善脓毒性)。请注意,您必须输入今天的日期和00、06、12或18(GMT)的预测时间,否则您可能会得到404找不到。保持预测时间不变。在

获取GRIB文件

^{pr2}$

Tags: inpyself脚本senddata网站lib
2条回答

我想知道这是否是内存问题,内存不足,所以被调出磁盘,速度太慢了。在

不管怎样,你正在打印“下载完成”。保存…“在你真正下载任何东西之前!在

试试这个:

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...")
IOError: [Errno socket error] [Errno -2] Name or service not known

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

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

奇怪的是,你在其他站点上没有问题;我无法解释为什么使用urllib进行HTML抓取对其他站点有效(也许这些脚本启用了代理?),但您遇到的异常肯定与DNS有关。在

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

^{pr2}$

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

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

相关问题 更多 >