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

目的

在进行气象研究时,获取准确的历史天气数据是至关重要的。本文将分享如何从天气网站收集数据并将其转化为表格形式,以便于后续分析。然而,在直接抓取数据时,可能会遇到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 csvheaders = {'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])

在这里插入图片描述

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“Pandas数据处理与分析:实用技巧与应用“

目录 # 开篇 1. pandas的series的了解 1.1 pd.Series 创建 1.2 pd.series 的索引使用 1.3 pd.series 之字典/索引 1.4 pandas 转换数据类型 1.5 pandas 通过索引或者通过位置来取值 1.6 pandas 指定行取值 1.7 pands之Series 切片和索引 1.8 pands之Series 的索引和值…

Python基础教学之三:函数与模块篇——实现代码重用和模块化

Python基础教学之三:函数与模块篇——实现代码重用和模块化 一、函数的定义与使用 1. 理解函数 函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码块。它可以提高代码的重用性和程序的清晰度。 你可以定义一个由自己想要功能的函数,以下是…

交易伦敦银系统,听说高手都有一套

成功的伦敦银交易者都有一套自己的交易系统,这个系统为他们提供了一个明确的、可重复的决策框架,无论白银市场如何波动,他们都能按照既定的规则和策略进行操作,避免了情绪化决策和随意交易——这样的一致性有助于减少错误和亏损&a…

Androd 12 (MTK)修改屏幕物理分辨率Physical Size

1.需求说明 Android目前显示分辨率为480*800,立项表中像素为720*1280。请修改屏幕分辨率到指定大小。 2.思路分析 如果从手机修改对应的分辨率,必须自上而下的进行修改分为两个层面进行修改。 1.驱动底层 2.软件上层 3.结局方法与相关说明 查看当…

安全防御---防火墙实验1

安全防御—防火墙实验1 一、实验拓扑与要求 要求: 1、DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问 2、生产区不允许访问互联网,办公区和游客区允许访问互联网 …

企业注册商标步骤

企业注册商标:详细步骤与关键要点 在当今商业环境中,商标已成为企业品牌建设和市场竞争中不可或缺的一部分。它不仅是企业身份的象征,也是企业知识产权的重要组成部分。 一、确定注册商标的商品项目 首先,企业需要明确需要注册商…

【游戏引擎之路】登神长阶(七)——x86汇编学习:凡做难事,必有所得

5月20日-6月4日:攻克2D物理引擎。 6月4日-6月13日:攻克《3D数学基础》。 6月13日-6月20日:攻克《3D图形教程》。 6月21日-6月22日:攻克《Raycasting游戏教程》。 6月23日-7月1日:攻克《Windows游戏编程大师技巧》。 7月…

Go语言---文件分类、设备文件、磁盘文件、实现打开/写/读/关闭/拷贝文件

设备文件: 屏幕(标准输出设备) fmt.Println()往标准输出设备写内容 键盘(标准输入设备) fmt.Scan()从标准输入设备读取内容 磁盘文件,放在存储设备上的文件 文本文件:以记事本打开,能看到内容(不是乱码) 二进制文件:以记事本打开…

微信右上角的“+”号,竟然能做这些事?90%的人不知道

微信,作为一款集社交、支付、娱乐于一体的超级应用,它的每一次更新都吸引着亿万用户的目光。 在微信的众多功能中,右上角的""号图标看似普通,实则隐藏着许多不为人知的实用技巧。本文将从四个方面深入挖掘这些隐秘功能…

打包时提示: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

用JavaScript将 NCR(Numeric Character Reference)标记转换为对应字符的方法

0 &#xff0c 、&#11111……是什么鬼&#xff1f; 最近&#xff0c;要将一些网页内容复制到<textarea>文本框中作进一步处理&#xff0c;发现有些网页内容中包含&#xff0c或之类的标记&#xff0c;会被原样复制到<textarea>文本框中。 如果将这些网页内容直…

Codeforces Round #956 (Div. 2) and ByteRace 2024(A~D题解)

这次比赛也是比较吃亏的&#xff0c;做题顺序出错了&#xff0c;先做的第三个&#xff0c;错在第三个数据点之后&#xff0c;才做的第二个&#xff08;因为当时有个地方没检查出来&#xff09;所以这次比赛还是一如既往地打拉了 那么就来发一下题解吧 A. Array Divisibility …

text prompt如何超过77个词

【深度学习】sdwebui的token_counter,update_token_counter,如何超出77个token的限制?对提示词加权的底层实现_prompt中token权重-CSDN博客文章浏览阅读1.6k次,点赞26次,收藏36次。文章探讨了如何在StableDiffusionProcessing中处理超过77个token的提示,涉及token_counte…

公司网站建站模板源码系统 响应式网站模版 随心自定义 带完整的代码包以及搭建部署教程

系统概述 公司网站建站模板源码系统是一套基于最新技术开发的网站建设解决方案。该系统集成了众多先进的网站开发工具和功能模块&#xff0c;旨在帮助企业快速构建出美观、实用的公司网站。通过采用模块化设计&#xff0c;系统实现了高度可定制性&#xff0c;企业可以根据自身…

土木转行嵌入式,拿到一家初创公司的嵌入式研发offer,值得去吗

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;不论从未来行业的发展前景…

java项目如何配置不同环境变量 以及 原理

如何配置不同的profile 首先&#xff0c;一个java项目&#xff0c;需要有不同的环境配置&#xff0c;打包时&#xff0c;自动使用对应的配置。那么&#xff0c;如何实现呢&#xff1f; 在你的Spring Boot项目的src/main/resources目录下创建或添加一个application.yml文件。这…

纯CSS瀑布流

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>瀑布流布局</title> <style>/* 瀑布…

[论文精读]BrainLM: A foundation model for brain activity recordings

论文网址&#xff1a;pdf (openreview.net) 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 省流版 1.1. 心得 1.2…

redis批量删除keys,用lua脚本。

文章目录 现象解决方法 现象 系统报错&#xff1a; misconf redis is configured to save ....后查看机器内存。 是内存满了&#xff0c;需要删除其中的key 解决方法 (1) 编写一个脚本&#xff0c;放在redis-cli.exe同一个目录 (2) 脚本内容如下&#xff1a; -- 使用Lua脚…

经典文献阅读之--Self-Supervised Bird’s Eye View Motion,,(基于跨模态信号的自监督鸟瞰图运动预测)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…