吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4279|回复: 42
收起左侧

[Java 转载] JAVA爬虫获取气象数据

  [复制链接]
大眼pro 发表于 2022-3-14 15:32
​
基于JAVA实现网络爬虫并且将实时数据存储到数据库中
打开网页http://www.weather.com.cn/​​
​
点击今天可查看详细天气信息
​
按F12查看网络接口,发现这个接口就是我们需要的信息了
http://d1.weather.com.cn/sk_2d/101110101.html?_=1646981448529
​
这个101110101是城市编码,可在city.js中查看各个城市的编码
https://j.i8tq.com/weather2020/search/city.js
​
调试接口:可直接复制当前接口到Postman或者Apifox中测试
​​​
Apifox:
​​
​
Postman:
​​
​​
​
测试接口可将多余的请求参数或者请求头删除,之后即可用Postman或者Apifox生成JAVAj代码
Postman:
​​
Apifox:
​​
​ ​
复制这些代码可直接放入项目中使用​
[Java] 纯文本查看 复制代码
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
Request request = new Request.Builder()
  .url("http://d1.weather.com.cn/sk_2d/101110101.html")
  .method("GET", null)
  .addHeader("Referer", "http://www.weather.com.cn/")
  .build();
Response response = client.newCall(request).execute();

创建数据库表
[SQL] 纯文本查看 复制代码
CREATE TABLE `weather` (
  `id` varchar(36) NOT NULL,
  `city_name` varchar(32) DEFAULT NULL COMMENT '城市名称',
  `city` varchar(32) DEFAULT NULL COMMENT '城市编码',
  `temp` int(11) DEFAULT NULL COMMENT '温度',
  `tempf` int(11) DEFAULT NULL COMMENT '华氏度',
  `wd` varchar(32) DEFAULT NULL COMMENT '风向',
  `ws` varchar(32) DEFAULT NULL COMMENT '风力',
  `wse` varchar(32) DEFAULT NULL COMMENT '风速',
  `sd` varchar(32) DEFAULT NULL COMMENT '湿度',
  `date_time` datetime DEFAULT NULL COMMENT '日期时间',
  `weather` varchar(32) DEFAULT NULL COMMENT '天气',
  `qy` varchar(32) DEFAULT NULL COMMENT '气压',
  `njd` varchar(32) DEFAULT NULL COMMENT '能见度',
  `rain` decimal(10,2) DEFAULT NULL COMMENT '降雨量',
  `rain24h` decimal(10,2) DEFAULT NULL COMMENT '降雨量24小时',
  `aqi` int(11) DEFAULT NULL COMMENT '空气质量',
  `limitnumber` varchar(32) DEFAULT NULL COMMENT '限号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

java业务代码
[Java] 纯文本查看 复制代码
/**
     * 获取数据业务代码
     */
    @SneakyThrows
    @Scheduled(cron = "0 0/3 * * * ? ")//每3分钟执行一次
    public void getWeather(){
        OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
        Request request = new Request.Builder()
                .url("http://d1.weather.com.cn/sk_2d/101110101.html")
                .method("GET", null)
                .addHeader("Referer", "http://www.weather.com.cn/")
                .build();
        Response response = client.newCall(request).execute();
        String body = response.body().string();
        //去除多余字符串
        body = body.substring(body.indexOf('{'));
        JSONObject jsonObject = JSONObject.parseObject(body);
        //创建实体类
        Weather weather = new Weather();
        weather.setCityName(jsonObject.getString("cityname"));
        weather.setCity(jsonObject.getString("city"));
        weather.setTemp(jsonObject.getInteger("temp"));
        weather.setTempf(jsonObject.getInteger("tempf"));
        weather.setWd(jsonObject.getString("WD"));
        weather.setWs(jsonObject.getString("WS"));
        weather.setWse(jsonObject.getString("wse"));
        weather.setSd(jsonObject.getString("SD"));
        weather.setQy(jsonObject.getString("qy"));
        weather.setQy(jsonObject.getString("qy"));
        weather.setNjd(jsonObject.getString("njd"));
        weather.setDateTime(dateFormat(jsonObject.getString("date"),jsonObject.getString("time")));
        weather.setRain(jsonObject.getBigDecimal("rain"));
        weather.setRain24h(jsonObject.getBigDecimal("rain24h"));
        weather.setAqi(jsonObject.getInteger("aqi"));
        weather.setWeather(jsonObject.getString("weather"));
        weather.setLimitnumber(jsonObject.getString("limitnumber"));

        //查看库中是否有重复数据
        QueryWrapper<Weather> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("city",weather.getCity());
        queryWrapper.eq("date_time",weather.getDateTime());
        List<Weather> weathers = baseMapper.selectList(queryWrapper);
        if(weathers.size()==0){
            baseMapper.insert(weather);
        }

    }

    /**
     * 日期格式转换
     * [url=home.php?mod=space&uid=952169]@Param[/url] dateStr 日期
     * @param timeStr 时间
     * @return
     */
    @SneakyThrows
    private Date dateFormat(String dateStr, String timeStr){
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        String dateString = year+"年"+dateStr.substring(0,dateStr.indexOf("("))+timeStr;
        DateFormat format = new SimpleDateFormat("yyyy年MM月dd日HH:mm");
        Date date;
        date = format.parse(dateString);
        return date;
    }

&#8203;
数据库中插入的数据,数据是以每5分钟一条更新。
&#8203;&#8203;

免费评分

参与人数 5吾爱币 +4 热心值 +3 收起 理由
amortall + 1 我很赞同!
rui1158656725 + 1 用心讨论,共获提升!
Heasitation + 1 + 1 抓包有什么好用软件呢
肖飞 + 1 + 1 我很赞同!
Buyu101 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 大眼pro 发表于 2022-4-13 09:20
lipr_ren 发表于 2022-4-13 07:03
各个水文站点水位和流量,各个站点的降雨量这些

你可以留个联系方式,我们细聊
北极meng 发表于 2022-4-7 23:40
大眼pro 发表于 2022-4-6 09:32
你取的是哪个城市的数据,是不是个别城市不限号?

有了 可能我看错接口了
XiaoBaizzZ 发表于 2022-3-14 15:42
狂派威震天 发表于 2022-3-14 15:54
学习一下,感谢楼主分享
Ironcarrot 发表于 2022-3-14 15:55
能做一个gui吗
kunze190523 发表于 2022-3-14 16:06
初来乍到,学习一下,感谢楼主分享
qh00048484 发表于 2022-3-14 16:13
感谢发布原创作品,吾爱破解论坛因你更精彩!
yuechaomax 发表于 2022-3-14 16:17
真的算是保姆级的教程了,好好研究一下。
zzbj 发表于 2022-3-14 16:24
学习了,稍后尝试试一下
liang8544 发表于 2022-3-14 16:26
感谢分享,学习了
TonyLiu 发表于 2022-3-14 16:37
666 厉害了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表