天气API强势对接

🤵‍♂️ 个人主页:@香菜的个人主页,加 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.mzph.cn/news/20107.shtml

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

相关文章

分布式系统的 38 个知识点

天天说分布式分布式&#xff0c;那么我们是否知道什么是分布式&#xff0c;分布式会遇到什么问题&#xff0c;有哪些理论支撑&#xff0c;有哪些经典的应对方案&#xff0c;业界是如何设计并保证分布式系统的高可用呢&#xff1f; 1. 架构设计 这一节将从一些经典的开源系统架…

静态路由下一跳地址怎么确定(静态路由配置及讲解)

一、用到的所有命令及功能 ①ip route-static 到达网络地址 子网掩码 下一跳 // 配置静态路由下一跳指的是和当前网络直接连接的路由器的接口地址非直连网段必须全部做路由路径是手工指定的&#xff0c;在大规模网络上不能用&#xff0c;效率低&#xff0c;路径是固定的稳定的…

瑞吉外卖实战-笔记

软件开发的流程 角色分工 软件环境 开发环境的搭建 数据库环境 maven环境 1.创建完成后&#xff0c;需要检查一下编码、maven仓库、jdk等 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</a…

Python实现GA遗传算法优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

TSINGSEE青犀视频安防监控EasyCVR视频汇聚平台电子地图定位偏移的排查与解决

安防监控EasyCVR视频汇聚综合管理平台具有强大的数据接入、处理及分发能力&#xff0c;平台可提供视频监控直播、云端录像、云存储、录像检索与回看、告警上报与查询、平台级联、云台控制、语音对讲、电子地图、轨迹跟踪、H.265自动转码等视频能力。 在视频监控管理平台TSINGSE…

word转pdf两种方式(免费+收费)

一、免费方式 优点&#xff1a;1、免费&#xff1b;2、在众多免费中挑选出的转换效果相对较好&#xff0c;并且不用像openOffice那样安装服务 缺点&#xff1a;1、对字体支持没有很好&#xff0c;需要安装字体库或者使用宋体&#xff08;对宋体支持很好&#xff09;2、对于使…

2023 电赛 E 题 K210 方案--K210实现矩形识别

相关库介绍 sensor&#xff08;摄像头&#xff09; sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(10) reset()&#xff1a;重置并初始化单目摄像头 set_pixformat()&#xff1a;设置摄像头输出格式&#xff0c…

中小学分班查询系统如何制作?这个方法值得借鉴

暑假即将结束&#xff0c;新学年即将开始&#xff0c;学校面临着一个重要的任务&#xff0c;那就是学生的分班问题。这个问题涉及到新生入学的分班&#xff0c;以及低年级学生升入高年级时的分班。对于负责分班的老师们来说&#xff0c;这无疑增加了不少工作量和挑战。 在开学…

上榜 Gartner | 中国领先的实时数据管理厂商 DolphinDB

在 Gartner 近日发布的 Hype Cycle for Data, Analytics and AI in China, 2023 报告中&#xff0c;DolphinDB 位列实时数据管理代表厂商。这是自去年 DolphinDB 入选 Gartner《中国数据库管理系统供应商甄选》后&#xff0c;又一次凭借领先的产品能力获得国际权威第三方分析机…

P2P网络NAT穿透原理(打洞方案)

1.关于NAT NAT技术&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是一种把内部网络&#xff08;简称为内网&#xff09;私有IP地址转换为外部网络&#xff08;简称为外网&#xff09;公共IP地址的技术&#xff0c;它使得一定范围内的多台主机只…

python算法指南程序员经典,python算法教程pdf百度云

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;你也能看懂的python算法书 pdf&#xff0c;python算法教程这本书怎么样&#xff0c;现在让我们一起来看看吧&#xff01; 给大家带来的一篇关于算法相关的电子书资源&#xff0c;介绍了关于算法、详解、算法基础方面的内…

Kaggle狗图像分类实战

文章目录 Kaggle狗图像分类实战d2l安装问题python语法学习os.path.joind2l 数据加载streamlit Kaggle狗图像分类实战 d2l安装问题 d2l安装失败&#xff0c;报错如上图 去下面的网站下载到该项目文件目录下再pip install即可 Python d2l项目安装包(第三方库)下载详情页面 - …

ATFX汇评:英央行利率决议来袭,大概率加息25基点

ATFX汇评&#xff1a;今日19:00&#xff0c;英国央行公布利率决议、会议纪要和货币政策报告&#xff1b;半小时后&#xff0c;英国央行行长贝利召开货币政策新闻发布会。当前英国央行基准利率5%&#xff0c;市场预期将加息25基点至5.25%&#xff0c;假若符合预期&#xff0c;则…

【css】背景图片附着

属性&#xff1a;background-attachment 属性指定背景图像是应该滚动还是固定的&#xff08;不会随页面的其余部分一起滚动&#xff09;。 background-attachment: fixed&#xff1a;为固定&#xff1b; background-attachment: scroll为滚动 代码&#xff1a; <!DOCTYPE h…

opencv的Mask操作,选择图片中感兴趣的区域

最近做目标检测任务的时候&#xff0c;需要对固定区域的内容进行检测&#xff0c;要用到opencv的mask操作&#xff0c;选择图片固定的区域 代码 import cv2 import numpy as npimg cv2.imread(data/images/smoking.png)# 弹出一个框 让你选择ROI | x,y是左上角的坐标 x,y,w,…

23款奔驰C260 L更换内饰最全发光套件,提升车内氛围感

原厂1:1设计&#xff0c;免编程匹配&#xff0c;无损安装&#xff0c;可升级项目&#xff1a; 1、碳纤维中控氛围灯&#xff08;阿凡达水滴款&#xff09; 2、发光前风口&#xff1b; 3、发光后风口&#xff1b; 4、发光座椅背气氛灯&#xff1b; 5、中音发光盖板 6、主动…

数学分析:流形的线性代数回顾

因为是线性的&#xff0c;所以可以把所有的系数都提取出去。这也是多重线性代数的性质。可以看成基本的各项自变量的乘法。 这里可以看到两个不同基向量下&#xff0c;他们的坐标转化关系。 引出了张量积&#xff0c;也就是前面提到的内容。 对偶空间的例子总是比较美好。 因为…

使用express搭建后端服务

目录 1 创建工程目录2 初始化3 安装express依赖4 启动服务5 访问服务总结 上一篇我们利用TDesign搭建了前端服务&#xff0c;现在的开发讲究一个前后端分离&#xff0c;后端的话需要单独搭建服务。后端服务的技术栈还挺多&#xff0c;有java、php、python、nodejs等。在众多的技…

代理模式(Proxy)

代理模式是一种结构型设计模式&#xff0c;让开发者能够提供对象的替代品或其占位符。代理对象控制着对于原对象的访问&#xff0c;并允许在将请求提交给原对象前后进行一些处理。代理模式为原对象提供一种代理以控制对这个对象的访问&#xff0c;并由代理对象控制对原对象的引…

青蛙过河 [递推法]

青蛙过河 [递推法] 题目描述输入输出样例输入样例输出样例 递推解答A C 代码 题目描述 有一条河&#xff0c;左边一个石墩( A A A区)上有编号为 1 &#xff0c; 2 &#xff0c; 3 &#xff0c; 4 &#xff0c; … &#xff0c; n 1&#xff0c;2&#xff0c;3&#xff0c;4&am…