Python天气预报数据获取脚本

近来公司大屏幕的天气接口老是出问题,之前用的是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>
时间: 2024-12-17 10:05:08

Python天气预报数据获取脚本的相关文章

Python天气预报采集器 python网页爬虫

这个天气预报采集是从中国天气网提取广东省内主要城市的天气并回显.本来是打算采集腾讯天气的,但是貌似它的数据是用js写上去还是什么的,得到的html文本中不包含数据,所以就算了 爬虫简单说来包括两个步骤:获得网页文本.过滤得到数据. 1.获得html文本.  python在获取html方面十分方便,寥寥数行代码就可以实现需要的功能. def getHtml(url): page = urllib.urlopen(url) html = page.read() page.close() return

Python 远程调用脚本之 RPC

最近有个监控需求,需要远程执行集群每个节点上的脚本,并获取脚本执行结果,为了安全起见不需要账号密码登陆主机,要求只需要调用远程脚本模块的方法就能实现. 总结下python进行远程调用脚本方法: 登陆主机执行脚本,python模块支持如 pssh.pexpect.paramiko 以远程方法调用(不需要登陆主机),python模块 rpyc,支持分布式 socket 方式,稍显复杂,需要熟悉网络协议,起点比较高 rpyc支持远程调用.分布式计算,以较少代码量实现需复杂socket编程,本文主要介绍

Python SVN 更新 脚本

#configs PROJECTS = { "away3d":"svn://svnurl/away3d", "Away3DUCtrl":"svn://svnurl/Away3DUCtrl", "Editor":"svn://svnurl/Editor", "EditorUI":"svn://svnurl/EditorUI", "Skill

python压缩文件脚本

zf.py文件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 """ desc:读取配置文件config.ini压缩sourcepath路径到targetpath      并可以排除不需要压缩的文件excludefile time:2014/4/30 12:03:42 author:ggh """ import zipf

python注释、脚本参数、字节码

python注释.脚本参数.字节码 --道心 python安装 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\python27 3.配置环境变量 [右键计算机]-->[属性]-->[高级系统设置]-->[高级]-->[环境变量]-->[在第二个内容框中找到 变量名为Path 的一行,双击] --> [Python安装目录追加到变值值中,用 : 分割] 如:原来的值;C:\python27,切记前面有分号

Python统计nginx脚本信息

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 import urllib2 4 import json 5 import subprocess 6 import threading 7 8 #统计10个最长访问的ip 9 ip_raw = subprocess.Popen("cut -d ' ' -f1 host.access.log.* | sort | uniq -c | sort -rn | head -n 10 | awk '{p

用 Python 替代 Bash 脚本(转)

add by zhj: 其实作者是想说用Python来做那些Bash实现起来比较麻烦的部分,即将Bash与Python结合使用. 英文原文:http://www.linuxjournal.com/content/python-scripts-replacement-bash-utility-scripts 作者:Richard Delaney 翻译原文:http://www.oschina.net/translate/python-scripts-replacement-bash-utility

python发送邮件的脚本

python发送邮件的脚本,带有邮件内容与附件,邮件内容为串格式,附件为文件.如果想把某个目录下的所有文件当作附件发送,那请去掉注释. 代码如下: #!/usr/bin/python #coding utf-8 from email.MIMEText import MIMEText from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email import Utils, E

「python」: arp脚本的两种方法

「python」: arp脚本的两种方法 第一种是使用arping工具: #!/usr/bin/env python import subprocess import sys import re def arping(ipaddress = "192.168.1.1"): p = subprocess.Popen("/usr/sbin/arping -c 2 %s" % ipaddress, shell = True, stdout = subprocess.PIP