设为首页 收藏本站
查看: 784|回复: 0

[经验分享] Python天气预报数据获取脚本

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-20 10:08:13 | 显示全部楼层 |阅读模式
近来公司大屏幕的天气接口老是出问题,之前用的是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>




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-88597-1-1.html 上篇帖子: python深拷贝与浅拷贝 下篇帖子: Python之strip与split函数 天气预报
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表