获取当前所在地的天气

1.我们需要准备一个文件,得到全国每个地区的天气编码(如下)

因为在每个地区的气象台都会存在一个相关的编号,我们主要是通过锁定你当前的这个网络的IP地址得到你的所在地的城市(这个主要是借用的百度地图所提供的API),再通过这个城市名称去得到你的这个气象编码,最后通过你的这个气象编码去利用爬虫从气象网站去爬取相关的天气信息

北京:101010100
朝阳:101010300
顺义:101010400
怀柔:101010500
通州:101010600
昌平:101010700
延庆:101010800
丰台:101010900
石景山:101011000
大兴:101011100
房山:101011200
密云:101011300
门头沟:101011400
平谷:101011500
八达岭:101011600
佛爷顶:101011700
汤河口:101011800
密云上甸子:101011900
斋堂:101012000
霞云岭:101012100
北京城区:101012200
海淀:101010200
天津:101030100
宝坻:101030300
东丽:101030400
西青:101030500
北辰:101030600
蓟县:101031400
汉沽:101030800
静海:101030900
津南:101031000
塘沽:101031100
大港:101031200
武清:101030200
宁河:101030700
上海:101020100
宝山:101020300
嘉定:101020500
南汇:101020600
浦东:101021300
青浦:101020800
松江:101020900
奉贤:101021000
崇明:101021100
徐家汇:101021200
闵行:101020200
金山:101020700
石家庄:101090101
张家口:101090301
承德:101090402
唐山:101090501
秦皇岛:101091101
沧州:101090701
衡水:101090801
邢台:101090901
邯郸:101091001
保定:101090201
廊坊:101090601
郑州:101180101
新乡:101180301
许昌:101180401
平顶山:101180501
信阳:101180601
南阳:101180701
开封:101180801
洛阳:101180901
商丘:101181001
焦作:101181101
鹤壁:101181201
濮阳:101181301
周口:101181401
漯河:101181501
驻马店:101181601
三门峡:101181701
济源:101181801
安阳:101180201
合肥:101220101
芜湖:101220301
淮南:101220401
马鞍山:101220501
安庆:101220601
宿州:101220701
阜阳:101220801
亳州:101220901
黄山:101221001
滁州:101221101
淮北:101221201
铜陵:101221301
宣城:101221401
六安:101221501
巢湖:101221601
池州:101221701
蚌埠:101220201
杭州:101210101
舟山:101211101
湖州:101210201
嘉兴:101210301
金华:101210901
绍兴:101210501
台州:101210601
温州:101210701
丽水:101210801
衢州:101211001
宁波:101210401
重庆:101040100
合川:101040300
南川:101040400
江津:101040500
万盛:101040600
渝北:101040700
北碚:101040800
巴南:101040900
长寿:101041000
黔江:101041100
万州天城:101041200
万州龙宝:101041300
涪陵:101041400
开县:101041500
城口:101041600
云阳:101041700
巫溪:101041800
奉节:101041900
巫山:101042000
潼南:101042100
垫江:101042200
梁平:101042300
忠县:101042400
石柱:101042500
大足:101042600
荣昌:101042700
铜梁:101042800
璧山:101042900
丰都:101043000
武隆:101043100
彭水:101043200
綦江:101043300
酉阳:101043400
秀山:101043600
沙坪坝:101043700
永川:101040200
福州:101230101
泉州:101230501
漳州:101230601
龙岩:101230701
晋江:101230509
南平:101230901
厦门:101230201
宁德:101230301
莆田:101230401
三明:101230801
兰州:101160101
平凉:101160301
庆阳:101160401
武威:101160501
金昌:101160601
嘉峪关:101161401
酒泉:101160801
天水:101160901
武都:101161001
临夏:101161101
合作:101161201
白银:101161301
定西:101160201
张掖:101160701
广州:101280101
惠州:101280301
梅州:101280401
汕头:101280501
深圳:101280601
珠海:101280701
佛山:101280800
肇庆:101280901
湛江:101281001
江门:101281101
河源:101281201
清远:101281301
云浮:101281401
潮州:101281501
东莞:101281601
中山:101281701
阳江:101281801
揭阳:101281901
茂名:101282001
汕尾:101282101
韶关:101280201
南宁:101300101
柳州:101300301
来宾:101300401
桂林:101300501
梧州:101300601
防城港:101301401
贵港:101300801
玉林:101300901
百色:101301001
钦州:101301101
河池:101301201
北海:101301301
崇左:101300201
贺州:101300701
贵阳:101260101
安顺:101260301
都匀:101260401
兴义:101260906
铜仁:101260601
毕节:101260701
六盘水:101260801
遵义:101260201
凯里:101260501
昆明:101290101
红河:101290301
文山:101290601
玉溪:101290701
楚雄:101290801
普洱:101290901
昭通:101291001
临沧:101291101
怒江:101291201
香格里拉:101291301
丽江:101291401
德宏:101291501
景洪:101291601
大理:101290201
曲靖:101290401
保山:101290501
呼和浩特:101080101
乌海:101080301
集宁:101080401
通辽:101080501
阿拉善左旗:101081201
鄂尔多斯:101080701
临河:101080801
锡林浩特:101080901
呼伦贝尔:101081000
乌兰浩特:101081101
包头:101080201
赤峰:101080601
南昌:101240101
上饶:101240301
抚州:101240401
宜春:101240501
鹰潭:101241101
赣州:101240701
景德镇:101240801
萍乡:101240901
新余:101241001
九江:101240201
吉安:101240601
武汉:101200101
黄冈:101200501
荆州:101200801
宜昌:101200901
恩施:101201001
十堰:101201101
神农架:101201201
随州:101201301
荆门:101201401
天门:101201501
仙桃:101201601
潜江:101201701
襄樊:101200201
鄂州:101200301
孝感:101200401
黄石:101200601
咸宁:101200701
成都:101270101
自贡:101270301
绵阳:101270401
南充:101270501
达州:101270601
遂宁:101270701
广安:101270801
巴中:101270901
泸州:101271001
宜宾:101271101
内江:101271201
资阳:101271301
乐山:101271401
眉山:101271501
凉山:101271601
雅安:101271701
甘孜:101271801
阿坝:101271901
德阳:101272001
广元:101272101
攀枝花:101270201
银川:101170101
中卫:101170501
固原:101170401
石嘴山:101170201
吴忠:101170301
西宁:101150101
黄南:101150301
海北:101150801
果洛:101150501
玉树:101150601
海西:101150701
海东:101150201
海南:101150401
济南:101120101
潍坊:101120601
临沂:101120901
菏泽:101121001
滨州:101121101
东营:101121201
威海:101121301
枣庄:101121401
日照:101121501
莱芜:101121601
聊城:101121701
青岛:101120201
淄博:101120301
德州:101120401
烟台:101120501
济宁:101120701
泰安:101120801
西安:101110101
延安:101110300
榆林:101110401
铜川:101111001
商洛:101110601
安康:101110701
汉中:101110801
宝鸡:101110901
咸阳:101110200
渭南:101110501
太原:101100101
临汾:101100701
运城:101100801
朔州:101100901
忻州:101101001
长治:101100501
大同:101100201
阳泉:101100301
晋中:101100401
晋城:101100601
吕梁:101101100
乌鲁木齐:101130101
石河子:101130301
昌吉:101130401
吐鲁番:101130501
库尔勒:101130601
阿拉尔:101130701
阿克苏:101130801
喀什:101130901
伊宁:101131001
塔城:101131101
哈密:101131201
和田:101131301
阿勒泰:101131401
阿图什:101131501
博乐:101131601
克拉玛依:101130201
拉萨:101140101
山南:101140301
阿里:101140701
昌都:101140501
那曲:101140601
日喀则:101140201
林芝:101140401
台北县:101340101
高雄:101340201
台中:101340401
海口:101310101
三亚:101310201
东方:101310202
临高:101310203
澄迈:101310204
儋州:101310205
昌江:101310206
白沙:101310207
琼中:101310208
定安:101310209
屯昌:101310210
琼海:101310211
文昌:101310212
保亭:101310214
万宁:101310215
陵水:101310216
西沙:101310217
南沙岛:101310220
乐东:101310221
五指山:101310222
琼山:101310102
长沙:101250101
株洲:101250301
衡阳:101250401
郴州:101250501
常德:101250601
益阳:101250700
娄底:101250801
邵阳:101250901
岳阳:101251001
张家界:101251101
怀化:101251201
黔阳:101251301
永州:101251401
吉首:101251501
湘潭:101250201
南京:101190101
镇江:101190301
苏州:101190401
南通:101190501
扬州:101190601
宿迁:101191301
徐州:101190801
淮安:101190901
连云港:101191001
常州:101191101
泰州:101191201
无锡:101190201
盐城:101190701
哈尔滨:101050101
牡丹江:101050301
佳木斯:101050401
绥化:101050501
黑河:101050601
双鸭山:101051301
伊春:101050801
大庆:101050901
七台河:101051002
鸡西:101051101
鹤岗:101051201
齐齐哈尔:101050201
大兴安岭:101050701
长春:101060101
延吉:101060301
四平:101060401
白山:101060901
白城:101060601
辽源:101060701
松原:101060801
吉林:101060201
通化:101060501
沈阳:101070101
鞍山:101070301
抚顺:101070401
本溪:101070501
丹东:101070601
葫芦岛:101071401
营口:101070801
阜新:101070901
辽阳:101071001
铁岭:101071101
朝阳:101071201
盘锦:101071301
大连:101070201
锦州:101070701

2.去百度地图官网申请AK

用来获得当前你所在城市名称,在这里需要特别注意一下你申请的时候应用类型需要选择服务器,而不是浏览器,注意当前的应用类型要选择服务器,其次白名单要是0.0.0.0/0,否则无法得到当前所在地(我这边建议自己申请一个我的可能会到后面销毁掉)

登录百度帐号

其次进行编码

maven依赖

<dependencies>
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.10.2</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.79</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <!--添加配置跳过测试-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
            <configuration>
                <skipTests>true</skipTests>
            </configuration>
        </plugin>
    </plugins>
</build>

首先获得城市

package com.gjh.city;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class City {
    public String getcity(String city) throws IOException {
        {
            String citynumber="";
            //这个文件就是上面显示的天气编码
            File file=new File("D:/Code/dibiao/dibiao.txt");
            FileReader in=new FileReader(file);
            BufferedReader buf=new BufferedReader(in);
            String s="";
            while((s=buf.readLine())!=null)
            {
                String a[]=s.split(":");
                //System.out.println(a[0]);
                if(a[0].equals(city.substring(0, city.length()-1)))
                {
                    citynumber=a[1];
                }

            }
            in.close();
            buf.close();
            //System.out.println(citynumber);
            return citynumber;
        }

    }
}

获得天气信息和风向信息类

package com.gjh.city;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;

public class Search {
          /**
         * 查询天气信息
         * @param location
         * @return
         * @throws IOException
         */
        public String weather(String location) throws IOException {
            String url = "http://www.weather.com.cn/weather/"+location+".shtml";
            Document document = Jsoup.connect(url).get();//使用Jsoup怕取到当前的这个Url的信息
            Elements documentElementsByClass = document.getElementsByClass("sky skyid lv3 on");//通过document对象得到前端标签
            return documentElementsByClass.text();
        }

     /**
     * 得到风向
     * @param location
     * @return
     */
    public String windDirection(String location) throws IOException {
        String url = "http://www.weather.com.cn/weather/"+location+".shtml";
        Document document = Jsoup.connect(url).get();//使用Jsoup怕取到当前的这个Url的信息
        Elements documentElementsByClass = document.getElementsByClass("sky skyid lv3 on");//通过document对象得到前端标签
        String title="";//用来得到风向的变量
        for (Element byClass : documentElementsByClass) {
            Elements span = byClass.getElementsByTag("span");
            title= span.attr("title");
        }
        return title;
    }
}

然后在控制台输出相关的天气信息

package com.gjh.city;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.IOException;

public class Address {
    public static void main(String[] args) {
            //ignoreContentType的意思是防止爬取到的二进制信息产生垃圾(默认是false),如果传一个true的话他会默认省略这个校验步骤
            //这个主要是通过百度地图申请的这个ak来通过Jsoup进行解析出来得到他的这个城市名称
            Document doc=Jsoup.connect("http://api.map.baidu.com/location/ip?ak=HTh6scEq6iLFjccZH504Kkm5DjYr8Ybi").ignoreContentType(true).get();
            // System.out.println(doc.text());
            JSONObject jsonObj = JSON.parseObject(doc.text());
            //   System.out.println(jsonObj);
            JSONObject jsonObj1=jsonObj.getJSONObject("content").getJSONObject("address_detail");
            String cityName=(String) jsonObj1.get("city");
            City city=new City();
            String number= city.getcity(cityName);
            /*
             * 获取天气信息
             */
            Search search = new Search();
            String weather=search.weather(number);
            String[] weatherSplit = weather.split(" ");
            String windDirection = search.windDirection(number);
            String weatherInfo = weatherSplit[1];
            String strongWind = weatherSplit[3];
            String[] temperatureSplit = weatherSplit[2].split("/");
            String maxTemperature = temperatureSplit[0];
            String minTemperature= temperatureSplit[1];
            System.out.println("您所在地城市名称:"+cityName+ ",天气:"+weatherInfo+",风向: "+windDirection+",强度:"+strongWind+",最高温度:"+maxTemperature+"℃,最低温度:"+minTemperature);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

demo的Git源码:weather: 查询天气信息

注意

如果需要把这个代码融入到企业级开发里面的话我们这里需要注意一下并发(并发不大就自行考虑),因为这个主要是利用的是网络爬虫所得到的的气象信息,可能会出现延迟之类的

这个我是参考的这个博客,自己所理解的

java 用sevlet实现ip定位以及天气预报的功能_bigsai的技术博客_51CTO博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值