如何抓取和处理天气网站数据

目的

在进行气象研究时,获取准确的历史天气数据是至关重要的。本文将分享如何从天气网站收集数据并将其转化为表格形式,以便于后续分析。然而,在直接抓取数据时,可能会遇到API接口保护的问题。本文将详细解释解决这些问题的步骤,并展示如何将数据转化为可用的表格形式。

在这里插入图片描述

实现逻辑

总体逻辑

  1. 先从指定网站获取指定年份和月份的天气数据,并保存为文本文件。
  2. 然后从这些文本文件中解析出日期和温度数据,并将其保存到CSV文件中。

这段代码的总体逻辑可以分为两个主要部分:从网站获取历史天气数据并保存为文本文件,以及从这些文本文件中提取数据并保存到CSV文件中。下面是详细解释:

第一部分:获取历史天气数据并保存为文本文件

1. 导入必要的库
import requests
from bs4 import BeautifulSoup
from glob import glob
import csv
  • requests: 用于发送HTTP请求。
  • BeautifulSoup: 用于解析HTML内容。
  • glob: 用于查找符合特定模式的文件路径名。
  • csv: 用于读取和写入CSV文件。
2. 设置请求头和Cookies
headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'Sec-Ch-Ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'Sec-Ch-Ua-Mobile': '?0',
    'Sec-Ch-Ua-Platform': '"Windows"',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Host': 'tianqi.2345.com',
    'Referer': 'https://tianqi.2345.com/wea_history/51133.htm',
}
cookies = {
    'lastCityId': '51133',
    'lastCountyId': '51133',
    'lastCountyPinyin': 'tacheng',
    'lastCountyTime': '1718931941',
    'lastProvinceId': '40',
    'Hm_lpvt_a3f2879f6b3620a363bec646b7a8bcdd': '1718931942',
    'Hm_lvt_a3f2879f6b3620a363bec646b7a8bcdd': '1718929158',
}
  • headers: 模拟浏览器发送请求所需的头信息。
  • cookies: 用于维持会话信息。
3. 定义年份和月份列表
years = [2024, 2023, 2022]
months = [4, 5, 6]
  • yearsmonths:指定要获取数据的年份和月份。
4. 循环遍历年份和月份,发送请求并保存响应数据
for year in years:
    for month in months:
        url = f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=51133&areaInfo%5BareaType%5D=2&date%5Byear%5D={year}&date%5Bmonth%5D={month}'

        response = requests.get(url, headers=headers, cookies=cookies)

        with open(f'{year}-{month}.txt', 'w', encoding='utf-8') as file:
            file.write(response.json()['data'])
  • 构造URL:基于指定的年份和月份,构造获取历史天气数据的URL。
  • 发送请求:使用requests.get方法发送请求,附带请求头和cookies。
  • 保存数据:将返回的JSON格式数据写入以年份和月份命名的文本文件中。
    在这里插入图片描述

第二部分:从文本文件中提取数据并保存到CSV文件

1. 遍历所有文本文件
for file_path in glob('D:\lab\paper\date\*.txt'):
  • 使用glob模块查找匹配指定路径模式的所有文本文件。
2. 读取文件内容并解析HTML
with open(file_path) as fs:
    soup = BeautifulSoup(fs.read(), 'html.parser')
  • 读取文件内容:打开并读取每个文本文件的内容。
  • 解析HTML:使用BeautifulSoup解析文件内容。
3. 提取文件名并准备CSV文件
filename = file_path.split('\\')[-1].split('.')[0]
with open(f'{filename}.csv', 'w', newline='', encoding='utf-8') as file:
    csv_writer = csv.writer(file)
    csv_writer.writerow(['日期', '最高温', '最低温'])
  • 提取文件名:从文件路径中提取文件名,去除文件扩展名。
  • 准备CSV文件:创建新的CSV文件,并写入表头行。
4. 提取并写入数据到CSV文件
# 找到所有的日期和温度数据
for row in soup.select('.history-table tr')[1:]:  # 跳过表头
    columns = row.find_all('td')
    if len(columns) == 6:
        date = columns[0].text.strip()
        high_temp = columns[1].text.strip()
        low_temp = columns[2].text.strip()
    # 写入 CSV 文件
    csv_writer.writerow([date, high_temp, low_temp])
  • 选择数据行:使用CSS选择器.history-table tr找到所有表格行,跳过表头行。
  • 提取数据:从每行中提取日期、最高温和最低温数据。
  • 写入CSV文件:将提取的数据写入CSV文件中。
    在这里插入图片描述

全部代码


import requests
from bs4 import BeautifulSoup
from glob import glob 
import csv

headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    
    'Sec-Ch-Ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'Sec-Ch-Ua-Mobile': '?0',
    'Sec-Ch-Ua-Platform': '"Windows"',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Host': 'tianqi.2345.com',
    'Referer': 'https://tianqi.2345.com/wea_history/51133.htm',
}
cookies = {
    'lastCityId': '51133',
    'lastCountyId': '51133',
    'lastCountyPinyin': 'tacheng',
    'lastCountyTime': '1718931941',
    'lastProvinceId': '40',
    'Hm_lpvt_a3f2879f6b3620a363bec646b7a8bcdd': '1718931942',
    'Hm_lvt_a3f2879f6b3620a363bec646b7a8bcdd': '1718929158',

}
years = [2024,2023,2022]
months = [4,5,6]


for year in years:
    for month in months:
        url = f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=51133&areaInfo%5BareaType%5D=2&date%5Byear%5D={year}&date%5Bmonth%5D={month}'

        response = requests.get(url,headers=headers,cookies=cookies)

        with open(f'{year}-{month}.txt', 'w', encoding='utf-8') as file:
            file.write(response.json()['data'])

for file_path in glob('D:\lab\paper\date\*.txt'):
    
    with open(file_path) as fs:
        soup = BeautifulSoup(fs.read(), 'html.parser')
        filename = file_path.split('\\')[-1].split('.')[0]
        with open(f'{filename}.csv', 'w', newline='', encoding='utf-8') as file:
            csv_writer = csv.writer(file)
            csv_writer.writerow(['日期', '最高温', '最低温'])

            # 找到所有的日期和温度数据
            for row in soup.select('.history-table tr')[1:]:  # 跳过表头
                columns = row.find_all('td')
                if len(columns) == 6:
                    date = columns[0].text.strip()
                    high_temp = columns[1].text.strip()
                    low_temp = columns[2].text.strip()
                # 写入 CSV 文件
                csv_writer.writerow([date, high_temp, low_temp])


在这里插入图片描述

总结

通过以上步骤,我们成功从天气网站获取了历史天气数据,并将其转化为表格形式,方便后续的学术分析。尽管过程中会遇到一些技术难题,但通过调整策略和方法,可以顺利获取所需数据。希望这篇文章能为您的气象研究提供帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/791508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM - 绝对与相对位置编码 与 RoPE 旋转位置编码 源码

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140281680 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Transformer 是基于 MHSA (多头自注意力),然而,MHSA 对于位置是不敏感…

ONLYOFFICE 8.1版本版本桌面编辑器测评

ONLYOFFICE官网链接:ONLYOFFICE - 企业在线办公应用软件 | ONLYOFFICE ONLYOFFICE在线办公套件:在线办公套件 | ONLYOFFICE ONLYOFFICE在线PDF编辑器、阅读器和转换器:在线PDF查看器和转换器 | ONLYOFFICE ONLYOFFICE 8.1版本桌面编辑器是…

Linux文件:EXT2文件系统工作原理 软硬链接

Linux文件:文件系统究竟是什么?如何管理文件? 前言一、磁盘结构、存储策略1.1 磁盘存储结构1.2 磁盘存储策略1.3 磁盘的逻辑存储结构 二、如何管理磁盘文件三、如何管理组3.1 每个组保存的数据种类3.2 如何管理数据1、节点表(inod…

推荐算法——MRR

定义: MRR计算的是第一个正确答案的排名的倒数,并对所有查询取平均值。它衡量了模型在排序结果中快速找到正确答案的能力。 其中: Q 是查询的总数。ranki​ 是第 i 个查询中第一个正确答案的排名(位置)。如果第一个正…

设计模式8-桥模式

设计模式8-Bridge 桥模式 由来与目的模式定义结构代码推导1. 类和接口的定义2. 平台实现3. 业务抽象4. 使用示例总结1. 类数量过多,复杂度高2. 代码重复3. 不符合单一职责原则4. 缺乏扩展性改进后的设计1. 抽象和实现分离(桥接模式)2. 抽象类…

本地部署,GFPGAN: 实用的面部修复算法

目录 什么是 GFPGAN? 技术原理 主要功能 应用场景 本地安装 运行结果 结语 Tip: 在图像处理和计算机视觉领域,面部修复是一个重要且具有挑战性的研究方向。随着深度学习技术的不断进步,许多新的算法被提出,用于…

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现(7000字论文参考+源码+LW+部署讲解)

博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…

打包时提示:Missing Gradle Project Information.或者在加载gradle时出错

1.Android打包弹出错误提示框:missing gradle project information. please check if the IDE successfully synchronized its state with the Gradble project model. 2.加载gradle出错:修复报错后 File -> Sync Project with Gradle Files

【DevOps】在云原生时代的角色与重要性探索

🐇明明跟你说过:个人主页 🏅个人专栏:《未来已来:云原生之旅》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是云原生 2、云原生的核心特性 3、什么是DevOps…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 找单词(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

javaweb图书商城系统带万字文档网上书城java项目java课程设计java毕业设计

文章目录 图书商城系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档(9.9¥带走) 图书商城系统 一、项目演示 网上书城 二、项目介绍 语言:java 数据库:…

vue2+Dexie.js基本使用——前端大容量存储IndexedDB 的包装库

文章目录 IndexedDB存储IndexedDB常用概念Dexie.js操作流程获取一个数据库实例定义对象存储空间和索引等数据库结构_基本增删查改 IndexedDB 是一个事务型数据库系统,类似于基于 SQL 的 RDBMS。然而,不像 RDBMS 使用固定列表,IndexedDB 是一个…

数据结构 —— BellmanFord算法

数据结构 —— BellmanFord算法 BellmanFord算法检测负权值环BellmanFord和Dijkstra思想上的区别Dijkstra算法的思想Bellman-Ford算法的思想思想上的对比 我们今天来看一个算法BellmanFord算法,我们之前的Dijkstra算法只能用来解决正权图的单源最短路径问题。 Bell…

linux_进程概念——理解冯诺依曼体系结构

前言: 本篇内容是为了让友友们较好地理解进程的概念, 而在真正了解进行概念之前, 要先了解一下冯诺依曼体系结构。 所以博主会先对冯诺伊曼体系结构进行解释, 然后再讲解进程的概念。 ps: 本篇内容适合了解一些linux指…

新兴市场游戏产业爆发 传音以技术抢抓机遇 ​

随着年轻人口的增加以及互联网的普及,非洲、中东等新兴市场正迎来游戏产业的大爆发,吸引着全球游戏企业玩家在此开疆辟土。中国出海企业代表传音以新兴市场需求为中心,秉持本地化创新理念不断加强游戏等关键领域技术攻关凭借移动终端设备为全球玩家带来极致游戏体验,收获了消费…

变位齿轮的齿高好像不变

通过这个软件的计算,变位尺寸的大小径都会同时变化,从而整个齿高好像没有变化。 下面百度答案

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及负荷时空特性的高速公路链式微网光-储-充容量优化配置方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【C++报错已解决】Invalid Use of Incomplete Type

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言:一、问题描述1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:完整类型定义2.2 方法二…

【云岚到家】-day05-4-项目迁移-商品搜索

【云岚到家】-day05-4-项目迁移-商品搜索 2 项目迁移-商品搜索2.1 迁移目标2.2 能力基础2.2.1 索引同步方案设计能力2.2.2 Elasticsearch全文检索应用能力 2.3 需求分析2.3.1 界面原型2.3.2 功能列表梳理 2.4 系统设计2.4.1 索引结构2.4.2 索引同步方案2.4.3 搜索自动补全2.4.4…

Java---数组

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 前言 无论c语言还是java数组都是重中之重&#xff0…