urllib2错误'在加速器上找不到'

时间:2013-10-03 01:22:38

标签: python api http-status-code-404 urllib weather-api

我有一个python程序,定期检查weather.yahooapis.com的天气,但它总是抛出错误:urllib.HTTPError: HTTP Error 404: Not Found on Accelerator。我试过两台不同的电脑,没有运气,也没有改变我的DNS设置。我继续得到错误。这是我的代码:

#!/usr/bin/python

import time
#from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate
from xml.dom import minidom
import urllib2

#towns, as woeids
towns = [2365345,2366030,2452373]

val = 1
while val == 1:
time.sleep(2)
for i in towns:
    mdata = urllib2.urlopen('http://206.190.43.214/forecastrss?w='+str(i)+'&u=f')
    sdata = minidom.parseString(mdata)
    atm = sdata.getElementsByTagName('yweather:atmosphere')[0]
    current = sdata.getElementsByTagName('yweather:condition')[0]
    humid = atm.attributes['humidity'].value
    tempf = current.attributes['temp'].value
    print(tempf)
    time.sleep(8)

我可以通过导致错误的同一台计算机上的网络浏览器成功访问API的输出。

1 个答案:

答案 0 :(得分:2)

问题是您使用的是IP地址206.190.43.214而不是主机名weather.yahooapis.com

即使他们解析到同一主机(显然是206.190.43.214),实际在URL中的名称最终会成为HTTP请求中的Host:标头。而且你可以说这在这里有所不同:

$ curl 'http://206.190.43.214/forecastrss?w=2365345&u=f'
<404 error>
$ curl 'http://weather.yahooapis.com/forecastrss?w=2365345&u=f'
<correct rss>
$ curl 'http://206.190.43.214/forecastrss?w=2365345&u=f' -H 'Host: weather.yahooapis.com'
<correct rss>

如果您在浏览器中测试这两个网址,您会看到同样的事情。


因此,在您的代码中,您有两个选择。您可以使用DNS名称而不是IP地址:

mdata = urllib2.urlopen('http://weather.yahooapis.com/forecastrss?w='+str(i)+'&u=f')

...或者您可以使用IP地址并手动添加主机标头:

req = urllib2.Request('http://206.190.43.214/forecastrss?w='+str(i)+'&u=f')
req.add_header('Host', 'weather.yahooapis.com')
mdata = urllib2.urlopen(req)

修复此问题后,代码中至少还有一个问题。 minidom.parseString(mdata)mdata时,您无法致电urlopen;您需要在商品上调用read(),或使用parse代替parseString