需求背景:

公司是做外贸服装的,在亚马逊平台上有多个地区店铺运营,运营人员需要参考地区的天气情况,上新的服装.所以需要能够获取全球任意地区的天气情况.还需要预测未来10-15天的天气情况.

选型API:

天气API中有大把免费的api,如:国内的心知天气,国际的雅虎,还有今天的主角:wunderground

最终选择了wunderground,原因:1,需求是全球任意地区的(国内API请求国外地区需要收费才能访问), 2.wunderground提供是信息最全,最丰富的天气api.雅虎提供的天气API信息非常之简略.

直入主题:

官方API文档

这里的免费api只是说测试账号每天有500次的免费请求,要是公司需求大的话,那么就需要付费了.官网价格

准备工作,你需要在官网注册一个账号,然后随意打开一个API的文档, 你会见到

http://api.wunderground.com/api/Your_Key/conditions/q/CA/San_Francisco.json

当中Your_Key的位置有一串key.请保管记住.


python代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 18年3月6日 下午1:53
# @Author  : dongyouyuan
# @email   : 15099977712@163.com
# @File    : weatherApi.py
# @Software: PyCharm
#
# 通过全球天气预报API:http://api.wunderground.com(信息最多最全) 来获取信息import requests
import json
import datetime
import time
import operatordef timeStamp_to_dataTime(timestamp, format='%Y-%m-%d'):"""时间戳转换成格式化的时间:param timestamp: 时间戳:param format: 格式:return:"""if timestamp is None or not timestamp:return ''return datetime.datetime.fromtimestamp(int(timestamp)).strftime(format)def dataTime_to_timeStamp(data_tiem, format='%Y-%m-%d %H:%M'):"""格式化时间格式转换成时间戳:param data_tiem: 格式化时间:param format: 格式:return:"""if not data_tiem:return 0else:try:time_array = time.strptime(data_tiem, format)time_stamp = int(time.mktime(time_array))return time_stampexcept Exception as error_msg:print(error_msg)return 0def get_recent_10_days(date):"""获取前10天的时间格式 20180306:return: 返回列表"""date_list = list()for i in range(1, 11):tmp_date = (datetime.datetime.strptime(date, "%Y%m%d") - datetime.timedelta(days=i)).strftime('%Y%m%d')date_list.append(tmp_date)return date_listdef sorted_for_list_dict(list_dict, key, reverse=False):"""为列表排序,按照元素中dict的key:param list_dict::param key::return:"""return sorted(list_dict, key=operator.itemgetter(key), reverse=reverse)class Weather(object):def __init__(self):self.search_url = 'http://autocomplete.wunderground.com/aq'self._url = 'http://api.wunderground.com/api/'self._key = ''  # Your_ keyself.url = self._url + self._key + '/'self.timeout = 10def search(self, query):"""搜索地名,返回结果列表:param query::return:"""params = {"query": query}headers = {"Content-Type": "application/json"}r = requests.get(url=self.search_url, params=params, headers=headers, timeout=self.timeout)if r.status_code == 200:return r.json().get('RESULTS', None)else:print('请求失败,失败代码:{}'.format(r.status_code))return Nonedef get_today(self, zmw):"""根据zmw码获取今天的天气信息:param zmw::return:"""# temp 温度# humidity 湿度# weather 天气情况# wind 风# dewpoint 露点# UV 紫外线强度# pressure 压力url = self.url + 'conditions' + '/q/zmw:{}.json'.format(zmw)headers = {"Content-Type": "application/json"}r = requests.get(url=url, headers=headers, timeout=self.timeout)if r.status_code == 200:# print(r.json())return r.json().get('current_observation')else:print('请求失败,失败代码:{}'.format(r.status_code))return Nonedef get_hourly_today(self, zmw):"""根据zmw码获取今天每小时的天气信息:param zmw::return:"""url = self.url + 'hourly' + '/q/zmw:{}.json'.format(zmw)headers = {"Content-Type": "application/json"}r = requests.get(url=url, headers=headers, timeout=self.timeout)if r.status_code == 200:# print(r.json())return r.json().get('hourly_forecast')else:print('请求失败,失败代码:{}'.format(r.status_code))return Nonedef _get_forecast_10day(self, zmw):"""根据zmw码获取未来10天的天气预报:param zmw::return:"""# snow 降雪 (白天,晚上,全天)# wind 风 (最大,最小)# humidity 湿度(最大,最小,平均)# conditions 天气情况 icon icon_url# qpf 降水量(白天,晚上,全天)# low, high 温度(最高,最低)# pop 降水概率url = self.url + 'forecast10day' + '/q/zmw:{}.json'.format(zmw)headers = {"Content-Type": "application/json"}r = requests.get(url=url, headers=headers, timeout=self.timeout)if r.status_code == 200:return sorted_for_list_dict(r.json().get('forecast').get('simpleforecast').get('forecastday'), 'period')else:print('请求失败,失败代码:{}'.format(r.status_code))return Nonedef get_forecast_10day(self, zmw):"""根据zmw码获取未来10天的天气预报(并且整理数据输出):param zmw::return:"""f_day_list = self._get_forecast_10day(zmw)if f_day_list:result_list = list()for f_day in f_day_list:forecast_day = dict()date_time = "{}{}{}".format(f_day['date']['year'], f_day['date']['month'], f_day['date']['day'])time_stamp = dataTime_to_timeStamp(date_time, format='%Y%m%d')date_format = timeStamp_to_dataTime(time_stamp, format='%Y%m%d')# 当天日期forecast_day['date_format'] = date_format# 风wind = {'ave': f_day.get('avewind', {}),'max': f_day.get('maxwind', {})}forecast_day['wind'] = wind# 雪snow = {'day': f_day.get('snow_day', {}),'night': f_day.get('snow_night', {}),'allday': f_day.get('snow_allday', {})}forecast_day['snow'] = snow# 湿度humidity = {'min': f_day.get('minhumidity', 0),'max': f_day.get('maxhumidity', 0),'ave': f_day.get('avehumidity', 0)}forecast_day['humidity'] = humidity# 天气情况conditions = {'icon_url': f_day.get('icon_url', ''),'icon': f_day.get('icon', ''),'text': f_day.get('conditions', ''),'skyicon': f_day.get('skyicon', '')}forecast_day['conditions'] = conditions# 气压qpf = {'day': f_day['qpf_day'],'night': f_day['qpf_night'],'allday': f_day['qpf_allday']}forecast_day['qpf'] = qpf# 气温temp = {'low': f_day.get('low', {'celsius': '0', 'fahrenheit': '0'}),'high': f_day.get('high', {'celsius': '0', 'fahrenheit': '0'})}forecast_day['temp'] = tempforecast_day['pop'] = f_day.get('pop', 0)forecast_day['date'] = f_day.get('date', {})result_list.append(forecast_day)return result_listelse:return Nonedef get_hourly_10day(self, zmw):"""根据zmw码获取未来10天,每小时的天气预报:param zmw::return:"""url = self.url + 'hourly10day' + '/q/zmw:{}.json'.format(zmw)headers = {"Content-Type": "application/json"}r = requests.get(url=url, headers=headers, timeout=self.timeout)if r.status_code == 200:# print(r.json())return r.json()else:print('请求失败,失败代码:{}'.format(r.status_code))return Nonedef _get_history(self, zmw, date):"""根据zmw码获取历史天气:param zmw::param dates: 查询时间 20170608:return:"""url = self.url + 'history_{}'.format(date) + '/q/zmw:{}.json'.format(zmw)headers = {"Content-Type": "application/json"}r = requests.get(url=url, headers=headers, timeout=self.timeout)if r.status_code == 200:# print(r.json())return r.json()else:print('请求失败,失败代码:{}'.format(r.status_code))return Nonedef get_history(self, zmw, date):"""根据zmw码获取历史天气(并且整理数据输出):param zmw::param dates: 查询时间 20170608:return:"""h_day = self._get_history(zmw, date)if h_day['history']['dailysummary']:h_day = h_day['history']['dailysummary'][0]history_day = dict()# 当天日期history_day['date_format'] = date# 风wind = {'ave': {'dir': h_day.get('meanwdire', ''), 'degrees': h_day.get('meanwdird', ''),'kph': h_day.get('meanwindspdi', ''), 'mph': h_day.get('meanwindspdm', '')},'max': {'dir': '', 'degrees': '0', 'kph': '0', 'mph': '0'}}history_day['wind'] = wind# 雪snow = {'day': {'cm': h_day.get('snowdepthm', ''), 'in': h_day.get('snowdepthi', '')},'night': {'cm': '', 'in': ''},'allday': {'cm': '', 'in': ''}}history_day['snow'] = snow# 湿度humidity = {'min': h_day.get('minhumidity', ''),'max': h_day.get('maxhumidity', ''),'ave': h_day.get('humidity', '')}history_day['humidity'] = humidity# 天气情况conditions = {'icon_url': '','icon': '','text': '','skyicon': '','tornado': h_day.get('tornado', '0'),'fog': h_day.get('fog', '0'),'rain': h_day.get('rain', '0'),'snow': h_day.get('snow', '0'),'thunder': h_day.get('thunder', '0')}history_day['conditions'] = conditions# 气压qpf = {'day': {'mm': h_day.get('maxpressurem', '0.0'), 'in': h_day.get('maxpressurei', '0.0')},'night': {'mm': h_day.get('minpressurem', '0.0'), 'in': h_day.get('minpressurei', '0.0')},'allday': {'mm': h_day.get('meanpressurem', '0.0'), 'in': h_day.get('meanpressurei', '0.0')}}history_day['qpf'] = qpf# 温度temp = {'low': {'celsius': h_day.get('mintempm', '0'), 'fahrenheit': h_day.get('mintempi', '0')},'high': {'celsius': h_day.get('maxtempm', '0'), 'fahrenheit': h_day.get('maxtempi', '0')}}history_day['temp'] = temp# 可见度visi = {'min': {'km': h_day.get('minvism', '0.0'), 'mi': h_day.get('minvisi', '0.0')},'mean': {'km': h_day.get('meanvism', '0.0'), 'mi': h_day.get('meanvisi', '0.0')},'max': {'km': h_day.get('maxvism', '0.0'), 'mi': h_day.get('maxvisi', '0.0')}}history_day['visi'] = visi# 时间信息history_day['date'] = h_day.get('date', {})return history_dayelse:return Nonedef _get_history_10day(self, zmw, date):"""根据zmw码获取10天的历史天气(不包括传入天):param zmw::param dates: 查询时间 20170608:return:"""date_list = get_recent_10_days(date)result_list = list()for history_date in date_list:result_list.append(self._get_history(zmw=zmw, date=history_date))return result_listdef get_history_10day(self, zmw, date):"""根据zmw码获取10天的历史天气(不包括传入天)(并且整理输出):param zmw::param dates: 查询时间 20170608:return:"""date_list = get_recent_10_days(date)result_list = list()for history_date in date_list:result_list.append(self.get_history(zmw=zmw, date=history_date))return result_listif __name__ == '__main__':weather = Weather()search_result = weather.search('Paris')if search_result:zmw = search_result[0].get('zmw')if zmw:print('*'*100)# 获取未来10天的天气预告f_10daty = weather.get_forecast_10day(zmw=zmw)print(json.dumps(f_10daty, indent=4))print(len(f_10daty))# 获取某一天的历史天气# h_10daty = weather.get_history(zmw=zmw, date='20180306')# print(json.dumps(h_10daty, indent=4))# print(json.dumps(h_10daty, indent=4))# print(len(h_10daty))# 获取某天前10天的历史天气(不包括传入天)h_10daty = weather.get_history_10day(zmw=zmw, date='20180306')print(json.dumps(h_10daty, indent=4))print(len(h_10daty))


代码当中封装了Weather类,你需要把刚才注册得到的key放到类的key中去.

代码解析:

类中并没有按照官网API(/q/地区/地名.json)的方法去做,因为发现这样得出的结果往往不准确的.而是通过查询你需要的字符,你自己获得到zmw(这是个唯一的编码)

然后再通过此码去查询.然后在方法 get_forecast_10day(),get_history(), get_history_10day()封装了一下,原因是官网的不同api获取的天气信息所叫的名称不一样(变量名)

这样用起来有点麻烦,所以统一整理,封装了一下.

Python使用免费天气API,获取全球任意地区的天气情况相关推荐

  1. Java获取国内各个地区实时天气

    获取国内各个地区实时天气 不废话直接上代码 public static String getWeatherData(String cityId) {long time = new Date().get ...

  2. Android中基于心知天气API获取天气信息

    Android中基于心知天气获取天气信息 JSON JSON简介 JSON对象 JSON数组 JSON解析 Android中获取天气 获取天气的流程 获取心知天气的API key 获取心知天气的API ...

  3. Python小工具——通过API获取天气预报

    Python通过API获取天气预报 闲来无事,用Python实现了一个小工具,通过实现API来获取当前的天气预报. 获取API的key 在阿凡达数据上查找天气预报相关的API,注册申请可获得一个key ...

  4. STM32使用ESP8266模块AT指令连接心知天气API获取天气信息

    由于之前使用STM32单片机来开发一些物联网的小项目,接触到了WIFI模块ESP8266,所以写下来记录一下.本文主要介绍的是STM32通过发送AT指令集来控制ESP8266 WIFI模块连接WiFi ...

  5. 第三方免费开放API 获取用户IP 并查询其地理位置

    需求:有一个项目是微信公众号,属于汽车服务.当车主在填写车主资料或者车辆认证时,需要填写车牌号或者车架号:车牌号需要选择省,为了方便用户操作,所以想自动定位默认省,如下图: 我查询了一些博客,找到了一 ...

  6. 利用Arduino Esp8266 心知天气API 获取天气预报信息(修改后可以DIY一个小型的桌面气象台)

    前期准备: 注册心知天气,获取API密钥  https://www.seniverse.com 生成API请求地址,北京今天和未来4天的预报请求地址如下: https://api.seniverse. ...

  7. PHP请求天气api获取多个城市天气预报数据

    实现效果 例如需要在APP中展示用户添加的所有城市的天气效果, 天气api的接口可以进行最多30个城市ID同时查询天气, 这足够满足我们的需求了 使用了天气api的免费接口, 每日可请求500次 实现 ...

  8. 使用Python和Jenkins REST API获取git changes信息

    因为工作中发生过很严重的 Regression Issue,当时的解决方案是在Daily Build中使用二分法找到出问题的Build, 过程比较繁琐,所以就有了这么个需求,要求记录Daily Bui ...

  9. java 利用新浪天气API获取天气预报

    新浪为我们提供了天气预报获取接口API  http://php.weather.sina.com.cn/xml.php?city=武汉&password=DJOYnieT8234jlsK&am ...

  10. python地图 两点距离_使用Python调用百度地图Api获取两地距离

    完整代码可以关注公众号:Romi的杂货铺 1.获取百度api接口 首先需要在百度的公众平台http://lbsyun.baidu.com/上点击控制台,如果是新用户的话需要进行注册和验证.注册和验证完 ...

最新文章

  1. /etc/inittab
  2. 又一方案实现发行Token的功能,BCH平台Token即将迎来大爆发
  3. 一个简单的生产消费者示例
  4. 5G 在地空通信网络中的需求
  5. 找到所有小于N的素数
  6. tcp/ip详解--分层
  7. asp.net前台与后台访问
  8. idea 设置java内存_java相关:IntelliJ IDEA设置显示内存指示器和设置内存大小的方法...
  9. php mysql study_PHPstudy升级mysql数据库
  10. FIFO(命名管道)
  11. 【计算机网络】HTTP协议历史版本
  12. Python生成词云
  13. 豆瓣评分9.2,GitHub 3.3k的学霸笔记终于出书了!获得李宏毅等大佬好评 -- 文末送书...
  14. 3814.矩阵变换-AcWing题库
  15. cef 加载flash 弹框_cef 3.2357之后加载flash的方法
  16. 新浪微博批量删除微博方法
  17. 全国哀悼日,网站黑白素配方法
  18. 正则表达式,兼容正整数或负整数的写法
  19. java 约分_java如何将分数快速约分
  20. 摘录魏国谋士轮胜败要素

热门文章

  1. 前端 svg 图标的使用
  2. 3d学习笔记(十)——多人联机游戏
  3. Kubernetes监控:Dashbaord 2.0.0部署之证书创建和设定
  4. Referring Image Segmentation 综述
  5. Unity笔记-29-ARPG游戏项目-03-攀爬系统
  6. log4cxx linux 使用,log4cxx在Linux下的编译使用
  7. 编写程序的目的?为什么要学习编程
  8. 计算机专业为啥是吃青春饭的,计算机专业是吃青春饭的行业吗?
  9. dmac学习之基于LLI的multi block tranfer验证
  10. APP中方法超过64K的解决办法