廊坊建站,网络科技公司门户网站,网站建设 自动跳转,网站开发技术总结报告#x1f935;♂️ 个人主页#xff1a;香菜的个人主页#xff0c;加 ischongxin #xff0c;备注csdn ✍#x1f3fb;作者简介#xff1a;csdn 认证博客专家#xff0c;游戏开发领域优质创作者,华为云享专家#xff0c;2021年度华为云年度十佳博主 #x1f40b; 希望… ♂️ 个人主页香菜的个人主页加 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 dependencygroupIdorg.jsoup/groupIdartifactIdjsoup/artifactIdversion1.11.3/version/dependency
写个main函数获取数据 public static ArrayListString getTitles(String url) throws IOException {//获取请求连接Connection con Jsoup.connect(url);//请求头设置特别是cookie设置con.header(Accept, text/html, application/xhtmlxml, */*);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?cityid1100;ArrayListString 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 {MapString, 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 ListAlertPO queryAlert(Integer cityId) {try {MapString, 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);ListAlertPO 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