近来公司大屏幕的天气接口老是出问题,之前用的是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>