近来公司大屏幕的天气接口老是出问题,之前用的是webservice的http://www.webxml.com.cn/WebServices/WeatherWebService.asmx这个接口,坑的是每个月的25号该服务暂停维护,因此不得不寻找新的接口替换。。。

然后我在网站上找了很多接口(大都是过期的或者非免费的!)。。。类似

国家气象局提供的天气预报接口http://www.weather.com.cn/data/sk/101010100.html

2014年6月最新更新的http://www,weather.com.cn/adat/sk/101010100.html

http://webservice.36wu.com/weatherService.asmx

以上这些我都试过了。。。没几天这些数据就各种出问题!!!

接下来我就把我的最近新找的一个万年历的天气接口(http://wthrcdn.etouch.cn/WeatherApi?citykey=101230101)实例展示给大家

注意:以上的citykey可以根据不同城市自行修改的。。。因为我是公司内部应用,城市不变,我就写死了,后面大家也可以自己去找一个根据IP获取城市,然后再获取对应编码,最后获取天气信息的示例,这个在网站上应该也能找的到的,我之前看到过。


接下来废话少说,我就把我的可运行的python代码贴进来吧

#-*-coding:utf-8-*-
import urllib2
import time

url='http://wthrcdn.etouch.cn/WeatherApi?citykey=101230101'
f = urllib2.urlopen(url)
headers = f.info()
rawdata = f.read()

'''
值得注意的是这个万年历网址给的xml文件是经过gzip压缩的文件,纯粹的下载下来的话是会有问题的
所以这里进行gzip的解压缩操作
'''

if ('Content-Encoding' in headers and headers['Content-Encoding']) or \
    ('content-encoding' in headers and headers['content-encoding']):
    import gzip
    import StringIO
    data = StringIO.StringIO(rawdata)
    gz = gzip.GzipFile(fileobj=data)
    rawdata = gz.read()
    gz.close()

result=rawdata.decode('UTF-8')
#print result
h=open ( 'test.xml', 'w' )    #这里我把源数据存在本目录下的test.xml文件里面
h.write(rawdata)
h.close() 


try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET
     
def change_node_text(nodelist,text,is_add=False,is_delete=False):
    for node in nodelist:
        if is_add:
            node.text += text
        elif is_delete:
            node.text = ""
        else:
            node.text = text
def write_weather_xml(tree,out_path):
    tree.write(out_path,encoding="UTF-8",xml_declaration=True)
     
     
tree = ET.ElementTree(file="./test.xml")
root = tree.getroot()
'''
print(root[0].tag)
print(root[2].tag)
print(root[3].tag)
print(root[5].tag)
print(root[4].tag)
print(root[13][0][0].tag)
print(root[13][0][1].tag)
print(root[13][0][2].tag)
'''
if __name__ == "__main__":     #这边使用主函数的方法来运行时因为我们需要获取实时的数据,因此要写成一个循环里面
    while True:
        print('城市:'.decode('GBK')+root[0].text)
        city='城市:'.decode('GBK')+root[0].text
        print('当前温度:'.decode('GBK')+root[2].text+'℃'.decode('GBK'))
        wendu='当前温度:'.decode('GBK')+root[2].text+'℃'.decode('GBK')
        print('风力:'.decode('GBK')+root[3].text)
        fengli='风力:'.decode('GBK')+root[3].text
        print('风向:'.decode('GBK')+root[5].text)
        fengxiang='风向:'.decode('GBK')+root[5].text
        print('湿度:'.decode('GBK')+root[4].text)
        shidu='湿度:'.decode('GBK')+root[4].text
        print('日期:'.decode('GBK')+root[12][0][0].text)
        riqi='日期:'.decode('GBK')+root[12][0][0].text
        print('最'.decode('GBK')+root[12][0][2].text+"~"+'最'.decode('GBK')+root[12][0][1].text)
        temperature='最'.decode('GBK')+root[12][0][2].text+"~"+'最'.decode('GBK')+root[12][0][1].text
        print city+'  '+wendu+'  '+fengli+'   '+fengxiang+'   '+shidu+'  '+riqi+'  '+temperature
        print "==============================================================================="
        
        
        tree1 = ET.ElementTree(file="./Weather.xml")     #这里是因为我们这边程序原本设定好了一个格式,因此只能将数据填回该文件才行
        change_node_text(tree1.findall("City"),city)
        change_node_text(tree1.findall("TodayWeather"),wendu)
        change_node_text(tree1.findall("Wind"),fengli+' '+fengxiang)
        change_node_text(tree1.findall("Date"),time.strftime( "%Y-%m-%d %A", time.localtime(time.time()) ))
        change_node_text(tree1.findall("Temperature"),temperature)
        change_node_text(tree1.findall("PicUrl"),shidu)
        tree1.write("Weather.xml",encoding="UTF-8",xml_declaration=True)
        
        time.sleep(1200)
        #最后这个是因为我不希望程序一直运行,太浪费资源了,所以设置为每隔20分钟进行一次,也就是让程序获取完一次后休眠20分钟




==========================================================

以上代码还有许多冗余的,因为是赶时间完成的,我也就随便写写这个脚本,本人不是专门负责python开发的,如有错误还望大家指正


对了,以上程序还有一个问题,就是有的时候因为台风啊,暴雨啊,雷雨啊什么的,源数据的xml文件对应的节点会多一个警告的节点,由于本人精力有限,就没有做过多的处理,日后再对代码进行更正吧!


下面附上我们公司的weather.xml文件格式


<?xml version="1.0" encoding="utf-8"?>
<Weather>
  <City></City>
  <TodayWeather></TodayWeather>
  <Wind></Wind>
  <Date></Date>
  <Temperature></Temperature>
  <PicUrl></PicUrl>
</Weather>



转载于:https://blog.51cto.com/jong001/1675655