🤵♂️ 个人主页:@香菜的个人主页,加 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 之后看看到网页加载了很多的数据
也不知道哪里获取的数据的,每个请求到点下,看下服务器的响应,功夫不负苦心人,在一番扒拉之后看到了main.js
爬取Jsoup -->爬取不到数据
从上图可以看到有所有的接口,在搜索之后也看到了请求的结构体。不得不说官方还是蛮实在的。
接口对接实现
这里主要是获取天气和预警信息,预报信息不需要。
预警信息数据和天气信息的数据就不贴出来了,等会会把源码上传
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