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

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;}}

相关文章:

  • 【HW系列】—目录扫描、口令爆破、远程RCE流量特征
  • Flink Table API 编程实战详解
  • 查询端口占用情况的命令(windows、linux)
  • 多语言实现插值查找算法
  • 一级菜单401问题
  • 【Linux】进程状态优先级
  • 国产三维CAD皇冠CAD(CrownCAD)建模教程:汽车电池
  • 《重塑认知:Django MVT架构的多维剖析与实践》
  • 将 ubutun 的网络模式 从NAT 改到 桥接模式后,无法上网,linux 没有IP地址 的解决方案
  • SQL Server 和 MySQL 对比
  • Maven工程演示
  • 数据仓库基础知识总结
  • DB2数据库HADR配置及详解
  • Jenkins分配对应项目权限与用户管理
  • AppArmor(Application Armor)是 Linux 内核的一个安全模块
  • 功耗仅4W!迷你服务器黑豹X2(Panther X2)卡刷、线刷刷入Armbian(ubuntu)系统教程
  • leetcode每日一题 -- 2894.分类求和并作差
  • 【华为云物联网】iOtDA数据以表格字段转发OBS的设置攻略,便于以后数据上大屏
  • Java构建Tree并实现节点名称模糊查询
  • 商用密码 vs 普通密码:安全加密的核心区别
  • 织梦网站模板免费/百度推广下载
  • 兰州财经大学网站开发与维护/企业网站建设平台
  • 深圳网站建设的客户在哪里/查询网址域名ip地址
  • 建网站价格 建设网站需要多少钱/百度手机端排名
  • 深圳的网站建设公司流程/线上推广100种方式
  • 波兰网站后缀/百度推广客户端app下载