美文网首页
从中国天气网爬天气数据帮助类

从中国天气网爬天气数据帮助类

作者: 根艮哏艮根 | 来源:发表于2018-01-16 10:07 被阅读0次

    写项目苦于没有天气数据,从各大开放的API请求数据的话太贵,没办法只能给项目经理说,他二话不说,直接暴力的从中国天气网上爬数据(牛的一批啊),默默崇拜中!!!

    先上中国天气网的Uri: http://www.weather.com.cn/

    中国天气网.png
    手机查天气
    下面就附上代码
    public class WeatherUtils {
    
        private final static int timeout = 3 * 1000;
    
        private String url = "http://m.weather.com.cn/d/town/index?lat=${lat}&lon=${lon}";
    
    
        /**
         * 获取天气更新的信息
         *
         * @param doc
         * @return {"time":"11:10更新","address":"兰州市保安服务总公司经济适用房东北","weather":"城关天气","city":"兰州市| 城关区"}
         */
        private Map<String, Object> getInfo(Document doc) {
            Map<String, Object> map = new HashMap<String, Object>();
            Element wrap = doc.getElementsByClass("wrap").get(0);
            Element city = wrap.getElementsByTag("h2").get(0);// 大的地址:兰州市|城关区
            Element address = wrap.getElementsByClass("address").get(0);//详细地址:兰州市保安服务总公司经济适用房东北
            Element weather = wrap.getElementsByClass("xian").get(0);//城关天气
            Element time = wrap.getElementsByTag("time").get(0);//更新时间
    //        map.put("city", city.text());
    //        map.put("address", address.text());
    //        map.put("weather", weather.text());
            map.put("time", time.text());
    //        map.put("cityCode", weather.attr("href").replaceAll("\\/mweather\\/(\\d+)\\.shtml", "$1"));
            return map;
        }
    
        private Map<String, Object> getCurrentWeather(Document doc) {
            Map<String, Object> map = new HashMap<String, Object>();
            Element midd = doc.getElementsByClass("n_wd").get(0);
            Element currentTemp = midd.getElementsByTag("h1").get(0)
                    .getElementsByTag("span").get(0);//当前温度
            Element weather = midd.getElementsByTag("h1").get(0)
                    .getElementsByTag("em").get(0);;//当前的天气 :阴
            Element wind = midd.getElementsByTag("h2").get(0)
                    .getElementsByClass("flfx").get(0);//风向
            Element humidity = midd.getElementsByTag("h2").get(0)
                    .getElementsByClass("xdsd").get(0);//相对湿度
    
            map.put("temp", currentTemp.text());
            map.put("weather", weather.text());
            map.put("wind", wind.text());
            map.put("humidity", humidity.text());
    
            Element swiperwrapper1 = doc.getElementsByClass("swiper-wrapper1").get(0)
                    .getElementsByClass("swiper-slide").get(0);
            Element i = swiperwrapper1.getElementsByTag("i").get(0);
            Element div = swiperwrapper1.getElementsByClass("tempLi").get(0);
            map.put("img", i.attr("class").replace("svnicon housr_icons ", ""));
            map.put("current", div.text());
    
            return map;
        }
    
        private Object getWeather(String cityCode, String referer) throws IOException {
            String url = "http://d1.weather.com.cn/dingzhi/" + cityCode + ".html";
            Connection conn = Jsoup.connect(url);
            conn.header("Referer", referer);
            Document doc = conn.get();
            String html = doc.html();
            String data = html.replaceAll("[\\r|\\n]", "")
                    .replaceAll(".*?(\\{.*?);.*", "$1");
            WeatherObject object = new Gson().fromJson(data, WeatherObject.class);
            return object.getWeatherinfo();
        }
    
        private Map<String, Object> getShzs(Document doc) {
            Map<String, Object> map = new HashMap<String, Object>();
            Elements elements = doc.getElementsByClass("shzs").get(0)
                    .getElementsByClass("swiper-slide");
            for (Element element : elements) {
                map.put(element.getElementsByTag("span").get(0).text(),
                        element.getElementsByTag("b").get(0).text());
            }
            return map;
        }
    
        public String query(String url) throws IOException {
            Connection conn = Jsoup.connect(url);
            conn.timeout(timeout);
            Document doc = conn.get();
            Map<String, Object> all = new HashMap<String, Object>();
            Map<String, Object> info = this.getInfo(doc);
            Map<String, Object> weather = this.getCurrentWeather(doc);
    //        Map<String, Object> shzs = this.getShzs(doc);
            //Object weatherinfo = this.getWeather((String)info.get("cityCode"),url);
            all.put("info", info);
            all.put("weather", weather);
    //      all.put("shzs", shzs);
            //all.put("weatherinfo", weatherinfo);
            return new Gson().toJson(all);
        }
    
        public String query(String lat, String lon) throws IOException {
            String url = this.url.replace("${lat}", lat).replace("${lon}", lon);
            return this.query(url);
        }
    
    }
    

    最后附上与程序相关的天气图片,这可是我们美工姐姐一个一个切出来,并且把名称对应上的昂。
    资源上传到csdn上了,有需要的可以下载去看看
    http://download.csdn.net/download/qq_32376365/10207440

    用法

        lat:维度
        lon:经度
        这里可以接入定位SDK.
    
        weatherUtils.query(lat, lon)
    

    相关文章

      网友评论

          本文标题:从中国天气网爬天气数据帮助类

          本文链接:https://www.haomeiwen.com/subject/ndnjoxtx.html