我有一个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的输出。
答案 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
。