精华内容
下载资源
问答
  • 五天天气
    万次阅读
    2020-03-10 11:10:26

    用Java的方式封装了一个天气的接口,查询了好多,要么是要收费的,要么需要使用官方的密匙Key。

    总不能项目上线了还要告诉运维记得换个key吧,想想就就得不现实。

    1、接口介绍

    所以,小编列举了几个网站,供大家使用,不需要key,完全免费,绝无后顾之忧:

    首先,当然是【国国家气象局】中天气预报提供的接口,总共三个:

    • http://www.weather.com.cn/data/sk/101010100.html;
    • http://www.weather.com.cn/data/cityinfo/101010100.html;
    • http://m.weather.com.cn/data/101010100.html;(已停用!!)

    注意:

    上面url中的“101010100”是城市代码,这里指代“北京”的城市代码。只需要改变城市代码,就可以得到所在城市的天气信息。其中,最详细的信息来自第三个接口,但是该接口已经停用了。

    第一个,第二个目前可用,但是查询的信息并不全,也不支持未来几天的天气预报等信息。

    但是,实际业务中我们有必要检索一个天气数据既全面,有支持未来几天预告的API。

    所以,再推荐几个来自【万年历】的天气预报查询接口,总结两个:

    • http://wthrcdn.etouch.cn/weather_mini?city=北京;
    • http://www.sojson.com/open/api/weather/json.shtml?city=北京;

    这两个接口还有一个明显的优势:不需要维护城市代码,可以使用城市名称进行天气查询,非常nice。

    第二个天气API详情介绍在 API 中心http://www.sojson.com/api/weather.html ,该接口经常发生变化,若无法访问请访问官网查看最新地址。

    所以,小编写一下【万年历】的第一个接口【wthrcdn.etouch.cn】的Demo:

    2、使用方法

    天气实体类:WeatherInfo

    public class WeatherInfo {
        private String date;        //时间
        private String week;        //星期
        private String lunar;       //农历时间
        private String cityname;    //城市名
        private String weather;     //天气
        private String temp;        //当前温度
        private String highTemp;    //最低温度
        private String lowTemp;     //当前温度
        private String tips;        //小提示
    
        ... (省略get,set,toString方法)
    
    }

    天气工具类:WeatherUtil

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.zip.GZIPInputStream;
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    /**
     * @author :tjm
     * 通过get请求向网站:http://wthrcdn.etouch.cn/weather_mini 获取某个 城市的天气状况数据,数据格式是Json
     * @date :Created in 2020/3/9 13:55
     *
     */
    public class WeatherUtils {
        private static String weatherUrl = "http://wthrcdn.etouch.cn/weather_mini?city=";
        /**
         * 通过城市名称获取该城市的天气信息
         */
        public static String GetWeatherData(String cityname) {
            StringBuilder sb = new StringBuilder();
            BufferedReader reader = null;
            try {
                URL url = new URL(weatherUrl + cityname);
                URLConnection conn = url.openConnection();
                InputStream is = conn.getInputStream();
                GZIPInputStream gzin = new GZIPInputStream(is);
                // 设置读取流的编码格式,自定义编码
                InputStreamReader isr = new InputStreamReader(gzin, "utf-8");
                reader = new BufferedReader(isr);
                String line = null;
                while((line = reader.readLine()) != null){
                    sb.append(line + " ");
                }
                reader.close();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return sb.toString();
        }
    
        /**
         * 将JSON格式数据进行解析 ,返回一个weather对象
         */
        public static WeatherInfo GetWeather(String weatherInfobyJson){
            JSONObject dataOfJson = JSONObject.fromObject(weatherInfobyJson);   // json天气数据
            if(dataOfJson.getInt("status") != 1000){
                return null;
            }
            // 创建WeatherInfo对象,提取所需的天气信息
            WeatherInfo weatherInfo = new WeatherInfo();
            
            // 获取当前日期:日期、星期
            Calendar cal = Calendar.getInstance();    							     // Calendar类的实例化
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日");  // 时间的格式化
            weatherInfo.setDate(sdf1.format(cal.getTime()));                // 时间
            SimpleDateFormat sdf2 = new SimpleDateFormat("EEEE");
            weatherInfo.setWeek(sdf2.format(cal.getTime()));                // 星期
    
            // 从json数据中提取数据:城市、温度、小提醒
            dataOfJson = JSONObject.fromObject(dataOfJson.getString("data"));
            weatherInfo.setCityname(dataOfJson.getString("city"));            // 城市
            weatherInfo.setTemp(dataOfJson.getString("wendu"));               // 温度
            weatherInfo.setTips(dataOfJson.getString("ganmao"));              // 小提示
    
            // 获取今天的天气预报信息:最高温度、最低温度、天气
            JSONArray forecast = dataOfJson.getJSONArray("forecast");
            JSONObject result = forecast.getJSONObject(0);
            weatherInfo.setHighTemp(result.getString("high").substring(2));   // 最高气温
            weatherInfo.setLowTemp(result.getString("low").substring(2));     // 最低气温
            weatherInfo.setWeather(result.getString("type"));                 // 天气
    
            return weatherInfo;
        }
    
    }

    测试代码:test

    public class Test {
    
        public static void main(String[] args){
            String info = WeatherUtils.GetWeatherData("天津");
            System.out.println("1.预测结果:" + info);                    // 全部天气数据,含预测
            WeatherInfo weatherinfo = WeatherUtils.GetWeather(info);
            System.out.println("2.今天天气:" + weatherinfo.toString());  // 当天天气数据
        }
    
    }

    结果:

    1.预测结果:

    {
        "data": {
            "yesterday": {
                "date": "9日星期一",
                "high": "高温 8℃",
                "fx": "东北风",
                "low": "低温 1℃",
                "fl": "<![CDATA[4-5级]]>",
                "type": "小雨"
            },
            "city": "天津",
            "forecast": [
                {
                    "date": "10日星期二",
                    "high": "高温 13℃",
                    "fengli": "<![CDATA[4-5级]]>",
                    "low": "低温 3℃",
                    "fengxiang": "西北风",
                    "type": "晴"
                },
                {
                    "date": "11日星期三",
                    "high": "高温 16℃",
                    "fengli": "<![CDATA[4-5级]]>",
                    "low": "低温 4℃",
                    "fengxiang": "西南风",
                    "type": "晴"
                },
                {
                    "date": "12日星期四",
                    "high": "高温 16℃",
                    "fengli": "<![CDATA[4-5级]]>",
                    "low": "低温 2℃",
                    "fengxiang": "东北风",
                    "type": "多云"
                },
                {
                    "date": "13日星期五",
                    "high": "高温 8℃",
                    "fengli": "<![CDATA[3-4级]]>",
                    "low": "低温 0℃",
                    "fengxiang": "北风",
                    "type": "多云"
                },
                {
                    "date": "14日星期六",
                    "high": "高温 10℃",
                    "fengli": "<![CDATA[4-5级]]>",
                    "low": "低温 2℃",
                    "fengxiang": "西北风",
                    "type": "晴"
                }
            ],
            "ganmao": "天冷风大且昼夜温差也很大,易发生感冒,请注意适当增减衣服。",
            "wendu": "9"
        },
        "status": 1000,
        "desc": "OK"
    }

    2.今天天气:

    WeatherInfo{date='2020年03月10日', week=星期二, lunar='null', cityname='天津', weather='晴', temp='9', highTemp=' 13℃', lowTemp=' 3℃', tips='天冷风大且昼夜温差也很大,易发生感冒,请注意适当增减衣服。'}

    注意:

    • 预测结果:是该API获取的全部数据,包含昨天,今天,以及未来4天的天气情况;
    • 今天天气:是从预测结果JSON数据中取出来,封装成对象的数据,在data.forecast下的第一条记录中。

     

    更多精彩,请关注我的"今日头条号":Java云笔记
    随时随地,让你拥有最新,最便捷的掌上云服务

     

     

     

    更多相关内容
  • WeatherDashboard 这将是一个网站,显示给定城市的五天天气预报。 有一个按钮将清除本地存储。 当您单击按钮时,下次单击重新加载按钮时,将不会加载新城市,并且屏幕将重置。 如果您单击浏览器的“重新加载”按钮,...
  • 当用户单击城市名称或输入城市名称时,他们会看到当前的天气状况以及5天气预报。 链接 挑战性 正在为UV索引创建颜色值,以及更便于用户使用的日期显示。 未来功能 根据低湿度,高温和大风向城市添加火灾危险...
  • 您可以看到当前的统计信息,例如温度和颜色编码的UV指数,以及5的简明预报。指示在搜索框中输入城市名称进行搜索。 (由于API的限制,并非所有城市都可用。) 单击颜色编码的“紫外线指数”按钮以打开有关...
  • 查看网页源代码:分析一天气标签 ul li h1 p span i win  下面开始编写代码: BeautifulSoup的详细使用方法就不再介绍网上应该有很多,这里只针对本练习使用。 1.首先导入requests、BeautifulSoup库 import ...
  • 此程序集成了 根据IP显示天气预报 有三种调用格式,全面符合你的网页调用 搜索任意一个城市的 未来5天天气预报显示风力状况:污染指数:体感指数:中暑指数:穿衣指数:钓鱼指数:空气质量状况:防晒措施:舒适度...
  • weatherApp 5天天气预报
  • 主要特点:实时显示最新气温,五天天气预报,托盘显示温度,可自定义背景图片和托盘温度图标 使用说明: 1、Vista不支持程序内置的单色托盘图标,需要托盘显示温度的话请使用外部图标 2、城市列表中没有的城市,请...
  • vb5天天气预报

    2018-08-14 22:24:05
    利用vb设计5天天气查询系统,信息来自于新浪天气,可选择国内市级以上城市
  • 稳定高效的天气API接口是很少有的,本站前一段时间开发了一个万年历,需要带天气预报,花了几功夫,集成和容错处理好对外开放的天气接口。天气接口支持返回 JSON 和 XML 结果。并且可以获取到昨天,以及今天和未来...

    序言

    稳定高效的天气API接口是很少有的,本站前一段时间开发了一个万年历,需要带天气预报,花了几天功夫,集成和容错处理好对外开放的天气接口。天气接口支持返回 JSON 和 XML 结果。并且可以获取到昨天,以及今天和未来4 天的天气预报。那么下面直接介绍天气预报的接口吧。

    天气API详情介绍 在 API 中心:http://www.sojson.com/api/weather.html ,下面只介绍下调用方式,然后 用 Java 语言调用演示一下。
    天气接口答疑
    1、接口能不能 ajax jsonp 的方式调用?

    答:不能,必须后端语言,或者移动端语言调用,比如 Java 、PHP、C#,PY等,或者 Android,iOS 之类。
    2、接口每天的更新时间是什么时候?

    答:这个接口每天更新一次,时间大概是在凌晨的1~4点这样子。有的时候也有意外情况。
    3、接口稳定吗?

    答:应该,也许、如果的话,是稳定的。如果不明白的话,你摸着良心觉得您问的是不是废话。
    4、天气有哪些状态?天气图片哪里获取?

    答:这里有所有状态列表,并且所有状态矢量图都是有的,加群,需要付费5元,QQ 群:259217951,进去后回复“天气图片”,群机器人会告诉你的。如果 QQ 钱包没钱,请去 赞助链接 微信或者支付扫码支付5元,联系群主加入。
    5、提示超过2000次是什么意思?

    答:这个天气接口每天就更新一次,请你自己做缓存,一天可以请求2000次完全够了,多次提示超过2000,就会封 IP 段。
    6、提示有恶意调用是什么意思?

    答:因为你一直循环调用,没有做缓存,对服务器造成了很大的压力,请参照第五点。
    7、我没有使用2000次,为什么提示超过2000次?

    答:因为是采用 IP 段检测,假如你的 IP 是200.148.88.99,那么对于的 IP 段就是200.148.88.* ,也就是这个IP 段下使用的资源是共享的。另外也可能是 CDN 缓存,刷新即可。
    7、请求返回状态301?

    答:请采用 HTTPS 请求,下面有对应的代码,如果是是 Java 请参考下面的代码,如果是其他语言,请自行百度“语言 + HTTPS”相关关键词。
    9、能不能一次性返回多个城市?一次性返回一个组合?能不能一次性返回7天、15天天气?能不能及时更新?能不能不限制3秒一次?能不能… … ?

    答:能!!!不过是收费。

    PS:不要对我要求过多,我对你保证不了什么。理论上你不付费,我不能给你提供什么承诺。都是要成本的。虽说现在接口很稳定。但是我还是不会提供保证。另外,接口不是我求着你用,你爱用不用。虽然你使用本站,是我的上帝,但是技术面前,都是平等的,别一副高高在上的口吻和我说话。谢谢。
    API最新消息

    使用此接口的同学,请务必加QQ群(608222884)【免费的】,最近的变动会在群里提醒并通知。

    最近 API 会变化,目前 API 从免费开放以来到现在,还是很稳定,最高一天达到1.4亿次调用,响应成功率达到98%。还是很赞的。
    目前我新购置了集群服务器,把 API 独立出去,涉及到的变化,域名从(www.sojson.com)改成了(api.sojson.com),支持 HTTPS 调用,字段稍微有变化,另外开放了及时天气和15天天气详细数据,不过是收费的,毕竟我也需要维护成本,不过比聚合API肯定便宜。

    接口为什么最近有缓存

    因为免费接口触及到了部分商家的奶酪,接口基本每天都会被攻击。 下面是被攻击的截图。不得已开启缓存模式,另外,好消息是新的接口,这些问题都没有,不会有缓存,因为每个人的接口 URL 地址都是不一样的。

    部分 CC 攻击识别是接口调用太频繁造成的,你说你们的对我的伤害基本是爆击。
    天气接口免费额度

    1.每天每个IP段拥有2000次免费额度,每次请求间隔为3秒一次,如果没有间隔3秒去请求,永远都不会通过,因为每次请求都是重新计时。

    2.请求频繁或者日请求量过大,会直接停封,比如秒并发达到100,比如日请求到达几万,服务器会自动屏蔽。也是禁用IP段。
    天气接口调用注意事项

    忠告:别把免费资源不当资源,能不能自己稍微做下缓存,或者全局变量方式缓存,要这样的用量,90%以上是无用的请求,那我怎么坚持下去?敬请理解,如果确实需要这么大的量,先联系,说清楚。

    天气预报 API 接口 JSON返回

    public static void json() throws Exception{
    //参数url化
    String city = java.net.URLEncoder.encode("北京", "utf-8");
    //拼地址
    String apiUrl = String.format("https://www.sojson.com/open/api/weather/json.shtml?city=%s",city);
    //开始请求
    URL url= new URL(apiUrl);
    URLConnection open = url.openConnection();
    InputStream input = open.getInputStream();
    //这里转换为String,带上包名,怕你们引错包
    String result = org.apache.commons.io.IOUtils.toString(input,"utf-8");
    //输出
    System.out.println(result);
    }
    

    如果 HTTPS 报错,Java请参考:https://www.sojson.com/blog/195.html,如果其他语言,请自行百度“语言 + HTTPS”相关关键词。
    天气预报 JSON 返回值:

    {
    "data": {
    "yesterday": {
    "date": "26日星期五",
    "high": "高温 31℃",
    "fx": "南风",
    "low": "低温 17℃",
    "fl": "微风",
    "type": "晴"
    },
    "city": "北京",
    "aqi": "83",
    "forecast": [
    {
    "date": "27日星期六",
    "high": "高温 34℃",
    "fengli": "微风级",
    "low": "低温 21℃",
    "fengxiang": "西南风",
    "type": "晴"
    },
    {
    "date": "28日星期天",
    "high": "高温 36℃",
    "fengli": "3-4级",
    "low": "低温 22℃",
    "fengxiang": "北风",
    "type": "多云"
    },
    {
    "date": "29日星期一",
    "high": "高温 29℃",
    "fengli": "微风级",
    "low": "低温 18℃",
    "fengxiang": "东风",
    "type": "阴"
    },
    {
    "date": "30日星期二",
    "high": "高温 30℃",
    "fengli": "微风级",
    "low": "低温 18℃",
    "fengxiang": "南风",
    "type": "阴"
    },
    {
    "date": "31日星期三",
    "high": "高温 32℃",
    "fengli": "3-4级",
    "low": "低温 20℃",
    "fengxiang": "南风",
    "type": "多云"
    }
    ],
    "ganmao": "各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。",
    "wendu": "27"
    },
    "status": 200,
    "message": "OK"
    }
    

    天气预报 API XML返回方式

    public static void xml() throws Exception{
    //参数url化
    String city = java.net.URLEncoder.encode("北京", "utf-8");
    //拼地址
    String apiUrl = String.format("https://www.sojson.com/open/api/weather/xml.shtml?city=%s",city);
    //开始请求
    URL url= new URL(apiUrl);
    URLConnection open = url.openConnection();
    InputStream input = open.getInputStream();
    //这里转换为String,带上包名,怕你们引错包
    String result = org.apache.commons.io.IOUtils.toString(input,"utf-8");
    //输出
    System.out.println(result);
    }
    

    如果 HTTPS 报错,Java请参考:https://www.sojson.com/blog/195.html,如果其他语言,请自行百度“语言 + HTTPS”相关关键词。
    天气预报 XML返回值:

    <?xml version="1.0" encoding="UTF-8"?>
    <resp>
    <city>北京</city>
    <updatetime>13:45</updatetime>
    <wendu>27</wendu>
    <fengli>3级</fengli>
    <shidu>38%</shidu>
    <fengxiang>东风</fengxiang>
    <sunrise_1>04:51</sunrise_1>
    <sunset_1>19:33</sunset_1>
    <sunrise_2></sunrise_2>
    <sunset_2></sunset_2>
    <environment>
    <aqi>83</aqi>
    <pm25>61</pm25>
    <suggest>极少数敏感人群应减少户外活动</suggest>
    <quality>良</quality>
    <MajorPollutants>颗粒物(PM2.5)</MajorPollutants>
    <o3>148</o3>
    <co>1</co>
    <pm10>106</pm10>
    <so2>27</so2>
    <no2>47</no2>
    <time>13:00:00</time>
    </environment>
    <yesterday>
    <date_1>26日星期五</date_1>
    <high_1>高温 31℃</high_1>
    <low_1>低温 17℃</low_1>
    <day_1>
    <type_1>晴</type_1>
    <fx_1>南风</fx_1>
    <fl_1>微风</fl_1>
    </day_1>
    <night_1>
    <type_1>晴</type_1>
    <fx_1>北风</fx_1>
    <fl_1>微风</fl_1>
    </night_1>
    </yesterday>
    <forecast>
    <weather>
    <date>27日星期六</date>
    <high>高温 34℃</high>
    <low>低温 21℃</low>
    <day>
    <type>晴</type>
    <fengxiang>西南风</fengxiang>
    <fengli>微风级</fengli>
    </day>
    <night>
    <type>晴</type>
    <fengxiang>北风</fengxiang>
    <fengli>微风级</fengli>
    </night>
    </weather>
    <weather>
    <date>28日星期天</date>
    <high>高温 36℃</high>
    <low>低温 22℃</low>
    <day>
    <type>多云</type>
    <fengxiang>北风</fengxiang>
    <fengli>3-4级</fengli>
    </day>
    <night>
    <type>阴</type>
    <fengxiang>东北风</fengxiang>
    <fengli>微风级</fengli>
    </night>
    </weather>
    <weather>
    <date>29日星期一</date>
    <high>高温 29℃</high>
    <low>低温 18℃</low>
    <day>
    <type>阴</type>
    <fengxiang>东风</fengxiang>
    <fengli>微风级</fengli>
    </day>
    <night>
    <type>阵雨</type>
    <fengxiang>南风</fengxiang>
    <fengli>微风级</fengli>
    </night>
    </weather>
    <weather>
    <date>30日星期二</date>
    <high>高温 30℃</high>
    <low>低温 18℃</low>
    <day>
    <type>阴</type>
    <fengxiang>南风</fengxiang>
    <fengli>微风级</fengli>
    </day>
    <night>
    <type>多云</type>
    <fengxiang>北风</fengxiang>
    <fengli>微风级</fengli>
    </night>
    </weather>
    <weather>
    <date>31日星期三</date>
    <high>高温 32℃</high>
    <low>低温 20℃</low>
    <day>
    <type>多云</type>
    <fengxiang>南风</fengxiang>
    <fengli>3-4级</fengli>
    </day>
    <night>
    <type>多云</type>
    <fengxiang>南风</fengxiang>
    <fengli>3-4级</fengli>
    </night>
    </weather>
    </forecast>
    <zhishus>
    <zhishu>
    <name>晨练指数</name>
    <value>适宜</value>
    <detail>天气不错,空气清新,是您晨练的大好时机,建议不同年龄段的人们积极参加户外健身活动。</detail>
    </zhishu>
    <zhishu>
    <name>舒适度</name>
    <value>很不舒适</value>
    <detail>白天天气晴好,但烈日炎炎会使您会感到很热,很不舒适。</detail>
    </zhishu>
    <zhishu>
    <name>穿衣指数</name>
    <value>炎热</value>
    <detail>天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。</detail>
    </zhishu>
    <zhishu>
    <name>感冒指数</name>
    <value>少发</value>
    <detail>各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。</detail>
    </zhishu>
    <zhishu>
    <name>晾晒指数</name>
    <value>极适宜</value>
    <detail>天气不错,极适宜晾晒。抓紧时机把久未见阳光的衣物搬出来晒晒太阳吧!</detail>
    </zhishu>
    <zhishu>
    <name>旅游指数</name>
    <value>较适宜</value>
    <detail>天气较好,感觉有点热,不过有微风伴您一路同行,还是较适宜旅游的,外出请注意防晒哦!</detail>
    </zhishu>
    <zhishu>
    <name>紫外线强度</name>
    <value>很强</value>
    <detail>紫外线辐射极强,建议涂擦SPF20以上、PA++的防晒护肤品,尽量避免暴露于日光下。</detail>
    </zhishu>
    <zhishu>
    <name>洗车指数</name>
    <value>较适宜</value>
    <detail>较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。</detail>
    </zhishu>
    <zhishu>
    <name>运动指数</name>
    <value>较适宜</value>
    <detail>天气较好,户外运动请注意防晒。推荐您进行室内运动。</detail>
    </zhishu>
    <zhishu>
    <name>约会指数</name>
    <value>较不适宜</value>
    <detail>天气较热,建议尽量不要去室外约会,如果外出,请您挑选荫凉的地点。</detail>
    </zhishu>
    <zhishu>
    <name>雨伞指数</name>
    <value>不带伞</value>
    <detail>天气较好,您在出门的时候无须带雨伞。</detail>
    </zhishu>
    </zhishus>
    </resp>
    <!-- 10.10.162.42(10.10.162.42):38553 ; 10.10.156.163:8080 -->
    

    注意的一点就是,参数中文要转码。要url转码。 Java 如下:

    //参数url化
    String city = java.net.URLEncoder.encode("北京", "utf-8");
    

    还有一点就是,编码为UTF-8

    展开全文
  • 天气预报描述天气预报是一个小型应用程序,可以显示用户输入的城市的今天和未来五天天气状况。目录技术使用jQuery,AJAX关联用法在输入框中输入城市名称,然后按其旁边的搜索图标。问题 有关项目的问题,请联系...
  • 该Gem的目的是向OpenWeatherAPI发出API请求,以查询气象数据以处理未来五天的平均温度。 安装 将此行添加到您的应用程序的Gemfile中: gem 'weatherfor' 然后执行: $ bundle install 或将其自己安装为: $ gem...
  • 天气应用 一个天气应用程序,可为您提供当前天气五天预报
  • 此程序集成了 根据IP显示天气预报 有三种调用格式,全面符合你的网页调用 搜索 任意一个城市的 未来5天天气预报 显示风力状况:污染指数:体感指数:中暑指数:穿衣指数:钓鱼指数:空气质量状况:...
  • 天气仪表板 天气规划器,五天预报
  • WeatherFore 使用OpenWeatherMap API和Google Geocoding API的天气应用,可以提供未来五天天气预报
  • 获取未来几天天气应该怎么解析josn数据??返回的josn代码如下所示: ![图片说明](https://img-ask.csdn.net/upload/201710/27/1509104625_431010.png) 是应建立一个类用来存放每天的天气数据,然后用Arraylist存放...
  • Android-天气-应用程序 Android 天气应用程序可帮助人们获取有关天气预报的信息。 Android Weather App 应用程序允许用户从城市列表中选择一个城市,并最多提前五天查看所选城市的天气预报。
  • 通过python爬虫程序爬取未来几日的天气状况

    千次阅读 多人点赞 2022-06-24 19:18:51
    通过python的爬虫程序,爬取天气预报的信息,包括当前的温度等,程序中规中矩,但是可以使用,效果还可以

    需求分析

    昨天,我做了一个天气预警信息的爬取,这个程序可以获取高温,或者其他极端的天气的预警信息情况。但是呢,其中有一位小伙伴就和我说,他希望不只能看到天气预警信息,也希望能够看到当前的天气状况,这样这个程序会比较方便,希望我能再出一期爬取天气状况的文章

    其实,在昨天爬取天气预警信息的时候,我首先已经考虑过了爬取天气状况,但是由于这个功能有一些麻烦,所以昨天没能成功实现

    具体的困难在于什么地方呢?简单来说就是,单纯获取天气状况不是什么困难的事情,困难的地方在于,如何让使用者选择地区呢?

    如果我们打开地区状况,我们会发现这个范围是很广泛的,具体到了每个市里面有每个区,每个区里面甚至还有具体的区域甚至景点。比如说,著名的景点,故宫博物院就有单独的天气状况信息,我们在程序中应该如何接受用户提交的地点信息情况呢?

    有两种选择,第一种情况,我们只提供有限的地点以供选择,比如说,我们将所有可以提供天气状况的区域保存到一个列表中,可能这个列表中有几十个或者几百个地点,使用者只可以从这个地点中进行选择。与此同时,我们可能还需要为其配备一套查询系统,以便于匹配用户提供的地点信息,这种方式的缺点在于能够保存的地点通常不是很多,而用户使用起来呢也有困难,他需要不断去我们的列表中进行选择

    第二种情况呢,就比较特别了,我们不保存任何的地点信息,我们也不知道用户提供的是否是一个可行的地点。也就是说,无论使用者输入了什么地点,我们都将这个地点原封不动的写入到爬虫程序中。这样的好处在于,我们不用判断地点信息是否有效,也不需要保存任何的额外信息。如果能够通过这个地点成功的爬取到数据,我们就返回数据,如果没办法通过这个地点获取到数据,那么就显示无数据。但这似乎不是一个好办法,这是在推卸责任

    另外的一个困难还在于,我们如何接受用户的地点信息呢?每次在使用这个程序之前,要求用户必须要先输入一段内容,然后再使用程序吗?这样合适吗?会不会给使用者带来很大的负担呢?这些都是需要考虑的问题

    因此,在面对这种困难的情况,没有办法作出一个有效的抉择,因此遭遇到了困难,现在我仍然没有一个好的方案

    页面分析

    俗话说得好,在自己不能解决问题的情况下,就应该多听取别人的意见,这样我们可能就有思路了。我也是向小伙伴征求了一下意见,看看怎么样解决这个问题才好

    一个小伙伴和我说,”这有什么困难的呢?我们就像提供天气的网站一样,使用提供的默认的地点不就解决了吗?“

    我一听,对啊,这样既不用使用者额外输入信息了,还能大概率得到一个正确的,使用者希望的内容,这是好事情啊,为什么不这样做呢?

    除了地点以外,我们还需要获得天气的更新时间,这样有助于帮助我们了解这个天气状况是在何时更新的。因为,众所周知,天气预报不是一件容易的事情,天气随时都会发生很大的变化,可能前一小时的天气预报中说要下雨,下一个小时的天气预报中就改为了晴天。因此,获取到更新时间是很重要的

    然后就是一些常规的天气信息了,比如说当前温度,最近几日的最高温,最低温等等,这是天气预报中最常见的情况,自然不必多说

    实现分析

    有了昨天经验以后,今天自然也是容易了很多,也不用纠结使用什么发起请求了,就直接用上selenium解决问题吧,当然,除了速度慢一些以外,selenium在使用上的困难程度和requests也相差无几

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get(url)

    那么,在成功发送完了请求之后,应该怎么办呢?很多人可能又会想,是不是应该通过find_element_by_xxx获取数据了呢?其实没有必要,我们不需要使用selenium的find_element_by_xxx的功能来获取数据,我们只需要通过driver.page_source得到页面的源代码,然后直接拿去解析就行了,这是一个很好的方法,没有必要说既然selenium已经提供了获取方法了,那就用它呗

    因此,我们还是通过lxml中的xpath获取数据

    html = etree.HTML(driver.page_source)
    
    # 以下就开始正常的从页面中提取数据

    到了这一步,正常来说就已经很简单了,当然,由于我们使用的是selenium打开了浏览器,因此在最后也不要忘记了关闭浏览器,也就是调用driver.quit(),至此我们的功能就已经全部实现了

    完整代码展示

    from base64 import b64decode
    from selenium import webdriver
    from lxml import etree
    
    driver = webdriver.Chrome()
    
    driver.get(b64decode("aHR0cDovL3d3dy53ZWF0aGVyLmNvbS5jbg==").decode())
    
    html = etree.HTML(driver.page_source)
    
    # 这一步很重要,打开了浏览器就要记得关掉,保持这样一个好习惯
    driver.quit()
    
    # 获取所在地区
    c = html.xpath("//span[@id='cityName']/text()")[0]
    print("当前所在地:", c)
    
    # 获取更新时间
    t = html.xpath("//div[@class='updataTimeDiv']/span/text()")
    print("天气的更新时间:", " ".join(t))
    
    # 获取风力和湿度
    f = html.xpath("//div[@class='weatherRow']/span/text()")
    print("状况:", " ".join(f))
    
    # 获取未来几天的天气状况
    d = html.xpath("//div[@class='dataRow']/div[@class='dataLi']/text()")
    d.insert(0, "今天")
    
    # 获取天气中的最高温度
    h = html.xpath("//div[@id='topTemp']//tspan/text()")
    
    # 获得天气中的最低温度
    l = html.xpath("//div[@id='lowTemp']//tspan/text()")
    
    for i in range(len(d)):
    	print(d[i], h[i], "-", l[i])

    以下是程序运行的结果展示

     感觉还可以,虽然不算美观,但至少简洁明了,我们需要的天气预报功能就实现了


    多数爬虫程序很快就会由于对方地址和服务变化导致失效,因此无法保证当你看到这篇文章时,文中的程序仍然可以使用。如果文中的程序已失效,需要自行或者求助他人进行重写

    另外,切勿将爬虫程序用于非法用途,或者错误的滥用造成对方网站的负担,谢谢!

    展开全文
  • 天气仪表板利用API提取数据,为用户提供天气预报,其中显示了当前天气和5天气预报。 城市,温度,湿度,风速和紫外线指数显示在每日天气预报中,温度和湿度显示在5预报中。 此外,还从天气API站点中提取了...
  • labview 天气预报

    2018-08-07 10:28:21
    labview 通过 API 读取五天天气预报.......................................................................................
  • 流星广播 meteorcast是一款简单的天气应用,具有城市搜索功能,可返回当前天气和5天天气预报。 使用构建
  • 爬取全国未来十天气数据一、网页分析二、数据提取三、数据保存 一、网页分析 二、数据提取 三、数据保存

    天气网站:https://www.tianqi.com/

    一、网页分析

    (一)请求分析(url)

    在这里插入图片描述

    1、观察

    北京海淀区 天气预报15天:https://www.tianqi.com/haidian/15/
    北京朝阳区 天气预报15天:https://www.tianqi.com/chaoyang/15/
    北京朝阳区 天气预报30天:https://www.tianqi.com/chaoyang/30/

    https://www.tianqi.com/haidian/15/
    https://www.tianqi.com/chaoyang/30/

    2、分析

    • https://www.tianqi.com:网址
      /haidian/:行政区域
      15/:未来15天

    3、结论

    • 改变请求(url)中的“行政区域”部分就可以获取不同城市地区的未来15日天气数据。

    (二)行政区域分析

    1、观察

    点击:【天气】——>【全国】
    获取行政区域:https://www.tianqi.com/chinacity.html
    在这里插入图片描述

    2、分析

    <div class=“citybox”>

    • <h2>:包含省份(provinces)
    • <span>:省份下的城市(citys)<a>

    3、结论

    通过提取 <div class=“citybox”> 下的信息就可获取到全国行政区域

    (三)未来15日 天气数据分析

    1、观察

    重庆渝中未来15日天气:https://www.tianqi.com/yuzhongqu/15/
    在这里插入图片描述

    2、分析

    <div class=“inleft”> :大类别

    • <ul class=“weaul”>:未来15日天气数据
      <li>:每一天的天气数据

    3、结论

    通过提取 <div class=“inleft”> 下的信息就可获取每个城市未来15日的天气状况

    二、数据提取

    (一)请求页面

    • get_html_soup(url) 函数,通过请求地址(url),返回soup(BeautifulSoup解析后的界面)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
        'Cookie': 'cityPy=kunming; cityPy_expire=1561950588; UM_distinctid=17133bbc7e6685-0b6045e36118e6-4313f6a-144000-17133bbc7e7a8e; CNZZDATA1275796416=1819259675-1585710340-%7C1585715624; Hm_lvt_ab6a683aa97a52202eab5b3a9042a8d2=1585710877,1585712908,1585712984,1585716742; Hm_lpvt_ab6a683aa97a52202eab5b3a9042a8d2=1585716834'
    }
    
    '''
    功能:请求页面
    parameters: 
        url:请求地址
    return:
        soup:BeautifulSoup解析后的界面
    '''
    def get_html_soup(url):
        req = requests.get(url, headers=headers)
        req.encoding = 'utf-8'
        html = req.text
        soup = BeautifulSoup(html, 'lxml')
        return soup
    

    (二)根据url获取行政区域

    <div class=“citybox”>

    • <h2>:包含省份(provinces)
    • <span>:省份下的城市(citys)<a>

    get_admArea(url) 函数

    • url:获取行政区域
    • 返回provinces_citys:——格式:list[string]:string如:‘ 北京,/beijing/,海淀,/haidian/ ’
    '''
    功能:根据url获取行政区域
    parameters:
        url:页面请求地址
    return:
        provinces_citys:list[string]:【北京,/beijing/,海淀,/haidian/】
    '''
    def get_admArea(url):
        # 省份及其城市
        provinces_citys = []
        # 请求页面
        soup = get_html_soup(url)
        cityBox = soup.find('div', class_='citybox')
        province_list = cityBox.find_all('h2')
        city_list = cityBox.find_all('span')
        # print(len(province_list))#31
        # 提取数据
        for i in range(len(province_list)):
            # 省份
            province_name = province_list[i].a.get_text()  # h2下的<a>标签下的内容
            province_url = province_list[i].a['href']  # h2下的<a>标签下的href
            # print(province_name,province_url)
            # 城市
            citys = city_list[i].find_all('a')
            for j in range(len(citys)):
                city_name = citys[j].get_text()
                city_url = citys[j]['href']
                str = province_name + ',' + province_url + ',' + city_name + ',' + city_url  # 以字符串形式存储
                provinces_citys.append(str)
        # 返回省份及其城市
        return provinces_citys
    

    (三)获取未来15天的天气数据

    <div class=“inleft”> :大类别

    • <ul class=“weaul”>:未来15日天气数据
      <li>:每一天的天气数据

    get_15_weather(provinces_city, year) 函数:

    • provinces_city:行政区域字符串string(格式:【北京,/beijing/,海淀,/haidian/】)
    • year: 年份<class ‘str’>如:‘2020’
    • 返回city_weather_list 天气状况:string‘北京,/beijing/,海淀,/haidian/,20200702,小雨,20,27,优,东风,2
    '''
    功能:获取未来15天的天气数据
    parameters:
        provinces_city:行政区域字符串string(格式:【北京,/beijing/,海淀,/haidian/】)
        year:年份<class 'str'>如:'2020'
    return:
    	city_weather_list天气状况:string‘北京,/beijing/,海淀,/haidian/,20200702,小雨,20,27,优,东风,2’
    '''
    def get_15_weather(provinces_city, year):
        year_now = year  # 年份<class 'str'>
        # https: // www.tianqi.com / yuzhongqu / 15 /
        city_weather_list = []  # 城市天气信息
        tianqi_url = 'http://tianqi.com'  # 历史天气
        content_list = provinces_city.split(',')  # 将每条行政区的信息转为list:‘北京’,’/beijing/‘,’海淀‘,’/haidian/‘
        city_tianqi_15_url = tianqi_url + content_list[3] + '15'  # 构建未来15天天气url
        soup = get_html_soup(city_tianqi_15_url)
        div_temp = soup.find('div', class_='inleft')
        if (div_temp != None):
            weather_list = soup.find('div', class_='inleft').find('ul', class_='weaul').find_all('li')
        else:
            return None
        # print(weather_list)
        for i in range(len(weather_list)):
            li = weather_list[i]
            # 提取时间:月日
            str_temp = li.find_all('div')[0].get_text()
            time_m_d = ''.join(re.findall(r'\d+', str_temp))  # ['07', '01']——月日0701
            time_y_m_d = year_now + time_m_d
            # 过渡时间(跨年)判断处理
            if (time_m_d == '1231'):
                y = int(year_now)
                y += 1
                year_now = str(y)
            # 提取天气状况
            str_temp = li.find_all('div')[2].get_text()  # 多云转小雨21~35℃
            weather_station = ''.join(re.findall(r'[\u4e00-\u9fa5]+', str_temp))  # 多云转小雨
            # 提取温度(最低、最高)
            temperature = re.findall(r'\d+', str_temp)
            temperature_min = temperature[0]
            temperature_max = temperature[1]
            # 提取空气质量
            air_quality = li.find_all('div')[3].span.get_text()  # 多云转小雨21~35℃
            # 提取风向、风力等级
            str_temp = li.find_all('div')[4].get_text()
            wind = ''.join(re.findall(r'^[\u4e00-\u9fa5]+', str_temp))
            wind_scale = ''.join(re.findall(r'\d+', str_temp))
            weather = provinces_city + ',' + time_y_m_d + ',' + weather_station + ',' + temperature_min + ',' + temperature_max + ',' + air_quality + ',' + wind + ',' + wind_scale
            city_weather_list.append(weather)
        return city_weather_list
    

    (四)数据保存

    • save_15_weather(weather_path, provinces_citys, year_now)
      • weather_path: 保存地址,如 ‘citys_15_weather.csv’
      • provinces_citys: 行政区域字符串list[string](格式:list【北京,/beijing/,海淀,/haidian/】)
      • year_now: 当前年份 <class ‘str’>r如:‘2020’
    '''
    功能:保存未来15日天气
    parameters:
        weather_path:'citys_15_weather.csv'
        provinces_citys:行政区域字符串list[string](格式:list【北京,/beijing/,海淀,/haidian/】)
        year_now:<class 'str'>r如:'2020'
    return:
        None
    '''
    def save_15_weather(weather_path, provinces_citys, year_now):
        with open(weather_path, 'w', encoding='utf-8') as f:
            for i in range(len(provinces_citys)):
                city_weather_list = get_15_weather(provinces_citys[i], year_now)
                if (city_weather_list != None):
                    for li in city_weather_list:
                        f.write(li + '\n')
                else:
                    continue
    

    (五)主函数

    if __name__ == '__main__':
        year_now = str(datetime.datetime.now().year)  # 获取当前时间(年)
        path_15_weather = 'citys_15_weather.csv'#数据存放地址(根目录下)
        # 获得行政区域列表
        city_url = 'https://www.tianqi.com/chinacity.html'  # 天气网站,用于爬取行政区
        provinces_citys = get_admArea(city_url)  # <class 'list'>:【北京,/beijing/,海淀,/haidian/】
        # 保存未来15日天气数据
        save_15_weather(path_15_weather, provinces_citys, year_now)
    
    展开全文
  • 当您需要或想要进行一些外部活动并且需要了解天气时,可以使用此站点。 左上角是搜索按钮,可用于查找特定城市的天气。 搜索部分的贝娄是一个历史表,其中有八个默认显示的大城市; 但是,当用户搜索其他城市时,...
  • 天气仪表板 一个简单的天气仪表板,可为您提供温度,湿度,风速和紫外线指数以及为期五天的预报。
  • 10月15日未来三全国天气预报.pdf
  • - 首页面:有各种组件装饰,显示天气、温度、风向及各种指数,还有未来三天气 - 城市管理界面:在这里可以对添加的城市进行管理 - 搜索更多城市页面:可以添加想要查看的城市 - 删除城市页面:可以删除已经...
  • 当用户点击用户界面中的任意位置时,将显示该位置的五天天气预报。 用户可以返回并搜索另一个位置,然后重复该过程。 当应用程序加载“芝加哥,伊利诺伊州”的默认天气数据时。使用AsyncTask在辅助线程中处理天气...
  • 本工具使用C#语言开发WinFrom软件,根据国家气象局天气预报接口获取未来十五天天气预报。只用来新手学习,里边主要涉及到Url请求,Json转List,Json转model。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,134
精华内容 10,053
关键字:

五天天气