天气API强势对接

news2024/11/20 8:40:56

🤵‍♂️ 个人主页:@香菜的个人主页,加 ischongxin ,备注csdn

✍🏻作者简介:csdn 认证博客专家,游戏开发领域优质创作者,华为云享专家,2021年度华为云年度十佳博主

🐋 希望大家多多支持,我们一起进步!😄

如果文章对你有帮助的话,

欢迎评论 💬点赞👍🏻 收藏 📂加关注+

目录

前言:

墨迹天气数据接口

1、找到目标网页

2、获取城市id

3、试图爬取网页

4、获取网页的技术方案

5、分析网页获取数据

接口对接实现

总结

前言:

最近在做天气的接口对接,从最初的需求要街道级的数据,后来到区级别的,导致最终的技术方案也不同。

区级别的数据选择的是中国天气网的API接口,这个是收费的接口,调研的时候使用了试用数据集,等到项目真正想要购买的时候发现数据集已经失效了,而且在电话沟通的时候对方需要发邮件进行沟通,咨询价格接口什么也不说,沟通受阻,交给了商务同学去沟通,没下文了

在后来需求进行了变更,天气状况只要到区级别就行了,所以有了新的方案,一个选择是使用和风天气的免费API,对于我们来说够用,一个是直接在线爬取。

和风天气的API需要注册,文档地址:实时天气 for API | 和风天气开发服务,这个接口使用起来还挺方便,后续准备接入。

墨迹天气是打算直接获取,也是这次的方案,无视规则,而且我们30分钟爬取一次。今天也就写下墨迹天气的爬取

墨迹天气数据接口

1、找到目标网页

地址:墨迹天气:每日天气预报

分析下url ,这里主要只有一个参数cityId,这个编码如何获取呐?

2、获取城市id

通过下面网页上的地址:墨迹天气:城市搜索

输入你想要查询到地方,然后查询,在新的网页上会有新城市的id,

我猜官方应该也提供了类似的列表和接口,但是因为我们只需要苏州市几个区的数据,就懒得去找了,直接使用最笨的方法

获取的编码如下

# 苏州市,相城区,吴江区,姑苏区, 吴中区, 虎丘区 ,张家港,常熟市 
city: 1093,284853,1103, 284854,1098, 284852,1101, 1100

3、试图爬取网页

当前获取苏州市的天气状况

目标网页: 墨迹天气:每日天气预报

获取的数据如下左图,F12 之后可以看到对应的位置

这次的目标数据主要有三部分:

  • 天气和温度,也就是上图的最上面一列
  • 天气详细状况,上图的风向,风级别,湿度,体感温度,空气质量等
  • 预警信息,当前这个网页没显示,也就是实时天气更新时间上面空白部分,也是我们这次获取的重点信息。

4、获取网页的技术方案

在pom.xml中加入jsoup

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.3</version>
        </dependency>

写个main函数获取数据

 public static ArrayList<String> getTitles(String url) throws IOException {
        //获取请求连接
        Connection con = Jsoup.connect(url);
        //请求头设置,特别是cookie设置
        con.header("Accept", "text/html, application/xhtml+xml, */*");
        con.header("Content-Type", "application/x-www-form-urlencoded");
        con.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36");
        con.header("accept-encoding", "gzip, deflate, br");
        //发送请求
        Document doc  =con.method(Connection.Method.GET).get();
        System.out.println(doc.toString());
        String indexTempNum = doc.getElementById("indexTempNum").text();
        return null;
    }
    public static void main(String[] args) throws IOException {
        String url = "https://html5.moji.com/tpd/mojiweather_pc/index.html?cityid=1100";
        ArrayList<String> titles = getTitles(url);
        System.out.println();
    }

在获取之后可以看到获取不到数据,只能看到占位符,真实的数据并没有

5、分析网页获取数据

F12 之后看看到网页加载了很多的数据

0

也不知道哪里获取的数据的,每个请求到点下,看下服务器的响应,功夫不负苦心人,在一番扒拉之后看到了main.js

爬取Jsoup -->爬取不到数据

 

0

从上图可以看到有所有的接口,在搜索之后也看到了请求的结构体。不得不说官方还是蛮实在的。

接口对接实现

这里主要是获取天气和预警信息,预报信息不需要。

预警信息数据和天气信息的数据就不贴出来了,等会会把源码上传

package com.tyjt.ccpweather.service;

import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.tyjt.ccpweather.po.AlertPO;
import com.tyjt.ccpweather.po.WeatherPO;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
public class WeatherUtil {


    public static WeatherPO queryWeather(Integer cityId) {
        WeatherPO build = null;
        try {
            Map<String, Object> paramMap = new HashMap<>();
            String url = "https://h5ctywhr.api.moji.com/weatherDetail";
            paramMap.put("cityId", cityId);
            paramMap.put("cityType", 0);
            String jsonString = JSON.toJSONString(paramMap);
            String result = HttpUtil.post(url, jsonString);
            JSONObject jsonObject = JSON.parseObject(result);
            if (!"0".equals(jsonObject.get("code").toString())) {
                return null;
            }
            String aqiDesc = jsonObject.getJSONObject("aqi").get("desc").toString();
            Integer aqiValue = jsonObject.getJSONObject("aqi").getInteger("value");
            JSONObject condition = jsonObject.getJSONObject("condition");

            Integer temp = condition.getInteger("temp");
            Integer realFeel = condition.getInteger("realFeel");
            Integer humidity = condition.getInteger("humidity");
            String windDir = condition.getString("windDir");
            Integer windLevel = condition.getInteger("windLevel");
            String weather = condition.getString("weather");
            String tips = condition.getString("tips");

            build = WeatherPO.builder().aqiDesc(aqiDesc)
                    .aqiValue(aqiValue)
                    .temp(temp)
                    .realFeel(realFeel)
                    .humidity(humidity)
                    .windDir(windDir)
                    .windLevel(windLevel)
                    .weather(weather)
                    .tips(tips)
                    .build();
        } catch (Exception e) {
            log.error("获取天气失败 ! cityId {}", cityId);
            log.error("", e);
        }

        return build;
    }

    public static List<AlertPO> queryAlert(Integer cityId) {
        try {
            Map<String, Object> paramMap = new HashMap<>();
            String url = "https://h5ctywhr.api.moji.com/weatherthird/alert";
            paramMap.put("cityId", cityId);
            String jsonString = JSON.toJSONString(paramMap);
            String result = HttpUtil.post(url, jsonString);
            JSONObject jsonObject = JSON.parseObject(result);

            List<AlertPO> resultList = new ArrayList<>();
            JSONArray alert = jsonObject.getJSONArray("alert");
            if (alert == null) {
                return null;
            }
            for (Object o : alert) {
                JSONObject item = (JSONObject) o;
                AlertPO build = AlertPO.builder()
                        .alertType(item.getInteger("alertTypeId"))
                        .level(item.getInteger("level"))
                        .content(item.getString("content"))
                        .publishTime(item.getLong("publishTime"))
                        .reliveTime(item.getLong("reliveTime"))
                        .publishSector(item.getString("publishSector"))
                        .name(item.getString("name"))
                        .build();
                resultList.add(build);
            }
            return resultList;
        } catch (Exception e) {
            log.error("获取预警信息失败 ! cityId {}", cityId);
            log.error("", e);
        }
        return null;
    }

    public static void main(String[] args) {
        queryAlert(2543);
    }
}

整个项目还有一些其他的细节,就不展示,这里直接贴出来下载地址

总结

整个实现过程还是花了不少时间,也学会了使用jsoup,这个包还是挺好用的。后面可以研究下

这里的接口也只选用了自己需要的一部分,后续可以根据不同项目要求,获取不同的天气

源码下载地址:https://download.csdn.net/download/perfect2011/88058335


 

 
本书主要以 Java 虚拟机的基本特性及运行原理为中心,深入浅出地分析 JVM 的组成结构和底层实现,介绍了很多性能调优的方案和工具的使用方法。最后还扩展介绍了 JMM 内存模型的实现原理和 Java 编译器的优化机制,让读者不仅可以学习 JVM 的核心技术知识,还能夯实 JVM 调优及代码优化的技术功底。

本书适合已具有一定 Java 编程基础的开发人员、项目经理、架构师及性能调优工程师参考阅读,同时,本书还可以作为广大职业院校、计算机培训班相关专业的教学参考用书。

京东购买链接:https://item.jd.com/13762401.html
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/830499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】SMILEtrack: SiMIlarity LEarning for Multiple Object Tracking,论文

论文&#xff1a;https://arxiv.org/abs/2211.08824 代码&#xff1a;https://github.com/WWangYuHsiang/SMILEtrack 文章目录 AbstractIntroductionRelated WorkTracking-by-DetectionDetection methodData association method Tracking-by-Attention Methodology架构概述外观…

汽配企业为什么需要MES管理系统解决方案

众所周知&#xff0c;汽配组装是汽车制造的关键环节&#xff0c;而汽配行业变革以精益为终极目标。制造业要想脱颖而出&#xff0c;就需要采用MES生产管理系统&#xff0c;以实现制造、物流、质量的精益化管理。在快速的流水线节拍生产下&#xff0c;汽配MES管理系统不仅提高了…

备忘录模式——撤销功能的实现

1、简介 1.1、概述 备忘录模式提供了一种状态恢复的实现机制&#xff0c;使得用户可以方便地回到一个特定的历史步骤。当新的状态无效或者存在问题时&#xff0c;可以使用暂时存储起来的备忘录将状态复原。当前很多软件都提供了撤销&#xff08;Undo&#xff09;操作&#xf…

Mybatis引出的一系列问题-Mybatis缓存机制的探究

Mybatis 使用到了两种缓存&#xff1a;本地缓存&#xff08;local cache&#xff09;和二级缓存&#xff08;second level cache&#xff09;。 一级缓存默认是开启的&#xff0c;而且不能关闭&#xff0c;MyBatis的一些关键特性&#xff08;例如通过<association>和<…

亚马逊采集淘宝(实现跨平台电商商品同步)

跨平台电商已成为当前电商行业的发展趋势&#xff0c;亚马逊作为全球的电商平台之一&#xff0c;为了更好地服务消费者&#xff0c;近期开始采集淘宝商品&#xff0c;并实现同步。 1. 亚马逊采集淘宝商品的背景 近年来&#xff0c;随着全球电商市场的不断扩大&#xff0c;跨平…

aspose-words、itextpdf完美解决java将word、excel、ppt、图片转换为pdf文件

我是傲骄鹿先生&#xff0c;沉淀、学习、分享、成长。 如果你觉得文章内容还可以的话&#xff0c;希望不吝您的「一键三连」&#xff0c;文章里面有不足的地方希望各位在评论区补充疑惑、见解以及面试中遇到的奇葩问法 面对日常开发过程中&#xff0c;将各种文件转换为pdf文件的…

MQ(一)-MQ理论与消息中间件简介

MQ理论 队列&#xff0c;是一种FIFO 先进先出的数据结构。消息&#xff1a;在不同应用程序之间传递的数据。将消息以队列的形式存储起来&#xff0c;并且在不同的应用程序之间进行传递&#xff0c;这就成了MessageQueue。MQ通常三大作用&#xff1a; 异步、解耦、限流 Spring…

【k8s】二进制部署k8s

二进制部署k8s 1.操作系统初始化配置2.部署etcd集群3.部署docker引擎4.部署Master组件4.部署 Worker Node 组件 二进制搭建 Kubernetes v1.20 k8s集群master01&#xff1a;192.168.80.10 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xf…

前端实现打印1 - 使用 iframe 实现 并 分页打印

目录 打印代码对话框预览打印预览 打印代码 <!-- 打印 --> <template><el-dialogtitle"打印":visible.sync"dialogVisible"width"50%"top"7vh"append-to-bodyclose"handleClose"><div ref"print…

京东API分享:获取京东商品评论接口

接口名称&#xff1a;item_review-获得JD商品评论 接口背景介绍&#xff1a; 京东是一家中国知名的综合性电商平台&#xff0c;成立于1998年。作为中国最大的B2C在线零售商之一&#xff0c;京东提供了包括电子产品、家居用品、服装配饰、食品饮料等在内的广泛商品选择。为了…

防抖函数,定时的清除

什么是防抖函数 在某一个时间段内&#xff0c;一个函数频繁快速的调用&#xff0c;只执行最后一次的调用。 防抖函数实际应用场景 我们在执行一个数据搜索功能时&#xff0c;通过监听input框的值&#xff0c;值变化触发搜索&#xff0c; 如果我们在输入框输入"zhangsa…

使用 Simulink 进行 STM32 编程

目录 介绍 所需材料 步骤 1&#xff1a;在MATLAB中设置STM32-MAT软件路径步骤 2&#xff1a;在STM32CubeMX中创建一个项目步骤 3&#xff1a;配置时钟和 GPIO 引脚步骤 4&#xff1a;项目经理并生成代码步骤 5&#xff1a;在 Simulink 中创建模型步骤 6&#xff1a;在模型中插…

前端如何实现一个网站的桌面快捷方式

题记&#xff1a;我们工作中常常需要在我们的网站首页实现一个桌面快捷方式&#xff0c;那么我们怎么做呢&#xff1f; 图片展示&#xff1a; 代码实现&#xff1a; 第一步&#xff1a;获取路径与标题名&#xff1b; sName: document.title, sUrl: window.location.href 第二步…

Java版知识付费平台免费搭建 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台qt

&#xfeff;Java版知识付费源码 Spring CloudSpring BootMybatisuniapp前后端分离实现知识付费平台 提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售…

c++11 标准模板(STL)(std::basic_ofstream)(一)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ifstream : public std::basic_istream<CharT, Traits> 类模板 basic_ifstream 实现文件流上的高层输入操作。它将 std::basic_istrea…

【Selenimu+AutoIT】非input标签上传文件(带参数)

工具下载 非input标签上传文件&#xff0c;就需要借助第三方工具&#xff0c;如AutoIT。 AutoIT下载 安装步骤略 使用 1.打开Auto Window Info 找到这个打开 拖住红框里面的标到需要定位的地方记录下来 2.打开SciTE Script Editor 打开后&#xff0c;修改为UTF-8&am…

程序员有必要参加软考吗?

作为程序员&#xff0c;如果一直从事着前线的编程工作&#xff0c;是否会对身体造成负担&#xff0c;难以持续到35岁呢&#xff1f;毕竟在项目赶期时&#xff0c;工作强度很高&#xff0c;而技术也在不断变化&#xff0c;因此很多程序员在30岁前就开始转型。我曾见过很多焦虑自…

观察者模式——对象间的联动

1、简介 1.1、概述 在软件系统中&#xff0c;有些对象之间也存在类似交通信号灯和汽车之间的关系。一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变&#xff0c;它们之间将产生联动&#xff0c;正所谓“触一而牵百发”。为了更好地描述对象之间存在的这种一…

【C++】初阶 --- 引用(超级详细版!!!)

文章目录 &#x1f36a;一、引用的概念&#x1f36a;二、引用的特性&#x1f37f;1、引用在定义时必须初始化&#x1f37f;2、一个变量可以有多个引用&#x1f37f;3、引用一旦引用一个实体&#xff0c;再不能引用其他实体 &#x1f36a;三、常引用(被const 修饰的引用)&#x…

idea打开传统eclipse项目

打开传统web项目 1.打开后选择项目文件 2.选择项目结构 3.设置jdk版本 4.导入当前项目模块 5.选择eclipse 6. 设置保存目录 7.右键模块&#xff0c;添加spring和web文件 8. 设置web目录之类的&#xff0c;并且创建打包工具 9.如果有本地lib&#xff0c;添加为库 最后点击应用&…