当前位置: 首页 > ai >正文

Java爬虫,获取未来40天预测气象并写入Excel

项目需要未来40天气象,找了一圈气象api,不是收费就是不支持未来40天,干脆写了个爬虫自动爬取气象网站的数据。以前都是用Python写的,重新拾起来再用Java写别有一番风味。

目标气象网站:西安天气预报40天_西安天气预报40天查询,西安未来40天天气预报- 东方天气

第三方依赖:

<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.3</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.1.0</version>
</dependency>

代码:

package com.test.main;import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import java.io.FileOutputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;@Slf4j
public class weatherSpider {public static void main(String[] args) {List<WeatherInfo> weatherInfos = new ArrayList<>();String url = "https://tianqi.eastday.com/xian/40/"; // 目标网页URL// 获取前两天的日期LocalDate twoDaysAgo = LocalDate.now().minusDays(2);// 设置日期格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");try {// 设置用户代理,尝试绕过访问限制Document document = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3").timeout(10000) // 设置超时时间.get();// 查找所有class为temp的div标签Elements tempElements = document.select("div.temp");// 遍历所有找到的div标签for (Element tempElement : tempElements) {// 获取div标签内的所有span标签Elements spanElements = tempElement.select("span");// 遍历所有span标签并打印内容for (Element spanElement : spanElements) {String spanText = spanElement.text();System.out.println(spanText);String lowTemp = spanText.split("~")[0];String highTempC = spanText.split("~")[1];String highTemp = highTempC.substring(0, highTempC.length() - 1);System.out.println("日期:" + twoDaysAgo.format(formatter) + " 温度:" + lowTemp + " ~ " + highTemp);WeatherInfo weatherInfo = new WeatherInfo();weatherInfo.setDate(twoDaysAgo.format(formatter));weatherInfo.setLowTemp(lowTemp); // 示例最低气温weatherInfo.setHighTemp(highTemp); // 示例最高气温weatherInfos.add(weatherInfo);twoDaysAgo = twoDaysAgo.plusDays(1);break;}}// 写入ExcelwriteWeatherToExcel(weatherInfos, "C:\\Users\\Xylon\\Desktop\\weather_forecast.xlsx");} catch (Exception e) {throw new RuntimeException(e);}}// 将天气数据写入Excelprivate static void writeWeatherToExcel(List<WeatherInfo> weatherInfos, String filePath) throws Exception {try (Workbook workbook = new XSSFWorkbook()) {Sheet sheet = workbook.createSheet("Weather Forecast");// 创建表头Row headerRow = sheet.createRow(0);String[] headers = {"Date", "LowTemp", "HighTemp"};for (int i = 0; i < headers.length; i++) {Cell cell = headerRow.createCell(i);cell.setCellValue(headers[i]);}// 写入天气数据for (int i = 0; i < weatherInfos.size(); i++) {Row row = sheet.createRow(i + 1);WeatherInfo weatherInfo = weatherInfos.get(i);row.createCell(0).setCellValue(weatherInfo.getDate());row.createCell(1).setCellValue(weatherInfo.getLowTemp());row.createCell(2).setCellValue(weatherInfo.getHighTemp());}// 写入文件try (FileOutputStream fileOut = new FileOutputStream(filePath)) {workbook.write(fileOut);}System.out.println("Weather data has been written to " + filePath);} catch (Exception e) {e.printStackTrace();}}// 天气信息类@Setter@Getterstatic class WeatherInfo {private String date;private String lowTemp;private String highTemp;}}

http://www.xdnf.cn/news/9215.html

相关文章:

  • 制作一款打飞机游戏58:子弹模式组合
  • 低空经济数据湖架构设计方案
  • 在springboot,禁止查询数据库种的某字段
  • 【linux篇】动静态库和自动化构建的“神之一手”:make、Makefile
  • AtCoder 第407场初级竞赛 A~E题解
  • java helloWord java程序运行机制 用idea创建一个java项目 标识符 关键字 数据类型 字节
  • 服务器中分布式存储数据技术都包含哪些内容?
  • maven 最短路径依赖优先
  • Qt QPaintEvent绘图事件painter使用指南
  • Qt函数setText设置中文导致乱码/程序崩溃/报错:常量中有换行符
  • html css js网页制作成品——HTML+CSS+js醇香咖啡屋网页设计(5页)附源码
  • 大模型应用开发第三讲:大模型是Agent的“大脑”,提供通用推理能力(如GPT-4、Claude 3)
  • inviteflood:基于 UDP 的 SIP/SDP 洪水攻击工具!全参数详细教程!Kali Linux教程!
  • 从零实现本地语音识别(FunASR)
  • 在AIX环境下修改oracle 11g rac的IP地址
  • 使用requestAnimationFrame编写动画效果或者处理大量数据
  • 时序数据库IoTDB安装学习经验分享
  • 第三届全国先进技术成果转化大会成功举办 中科亿海微携品亮相
  • 【premiere教程】【01】【跑个流程】
  • 【android bluetooth 协议分析 02】【bluetooth hal 层详解 6】【高通蓝牙hal主要流程介绍-下】
  • Java 基础全面解析
  • Kettle 远程mysql 表导入到 hadoop hive
  • WPF【11_7】WPF实战-重构与美化(ViewModel的嵌套与分解、海量数据不要Join)
  • OpenCV CUDA模块图像处理------颜色空间处理之GPU 上对两张带有 Alpha 通道的图像进行合成操作函数alphaComp()
  • 【洛谷P9303题解】AC代码- [CCC 2023 J5] CCC Word Hunt
  • ubuntu22.04 安装 SecureCRT8.7.3
  • 没有经验能考OCP认证吗?
  • 视频逐帧提取图片的工具
  • 拆解汽车HMI设计:如何用3D可视化提升驾驶安全感?
  • RagFlow参数配置测试