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

news2024/9/20 15:06:44

目的

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


在这里插入图片描述

总结

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

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

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

相关文章

【人工智能】-- 受限玻尔兹曼机

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉引言 🍉受限玻尔兹曼机 🍈RBM的结构 🍍RBM的架构图 🍍RBM的经典实现 &…

“论软件维护方法及其应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 软件维护是指在软件交付使用后,直至软件被淘汰的整个时间范围内,为了改正错误或满足 新的需求而修改软件的活动。在软件系统运行过程中,软件需要维护的原因是多种多样的, 根据维护的原因不同,可以将软件维护…

AI版Siri要明年见,研究表明ChatGPT暂无法取代程序员,Kimi推出浏览器插件

ChatGPT狂飙160天,世界已经不是之前的样子。 更多资源欢迎关注 根据彭博社记者马克古尔曼的最新消息,苹果公司今年不会推出全新的Apple Intelligence驱动的Siri,该公司计划在明年1月开始测试,并在iOS 18.4中才推出正式版本。 此前…

2.5 计算机网络

声明:文章参考的《系统架构设计师教程(第二版)》,如有侵权,本人将立即修改和删除。 利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,并依靠网络软件以及通信协议实现…

[迫真保姆级教程]在Windows上编译可用的Tesseract OCR in C++ 并部署在Visual Studio与Qt6上

目录 前言 阅前提示 导言 使用基于vcpkg的,于msvc19编译器编译的Tessereact OCR动态库 使用vcpkg辅助我们的编译 正文 使用msys2环境下的,使用mingw64编译器编译的Tessereact OCR动态库 什么是msys2 安装前,我们也许。。。 [Option]…

入门PHP就来我这(高级)24 ~ Session判断用户登录

有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享 路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。 上一篇我们介绍了Session管理部分的概念,本文通过session来改写一些用户登录&…

git批量删除本地包含某字符串的特定分支

git批量删除本地包含某字符串的特定分支 git branch -a | grep 分支中包含的字符串 | xargs git branch -D git删除本地分支_git查看删除本地分支-CSDN博客文章浏览阅读989次。git branch -d <分支名>可以通过: git branch 查看所有本地分支及其名字&#xff0c;然后删…

防火墙基础实验

首先交换机配置 [LSW7]undo info-center enable [LSW7]vlan batch 2 3 [LSW7]int g0/0/2 [LSW7-GigabitEthernet0/0/2]port link-type access [LSW7-GigabitEthernet0/0/2]port default vlan 2 [LSW7-GigabitEthernet0/0/2]int g0/0/3 [LSW7-GigabitEthernet0/0/3]port link-…

静态时序分析:Leaf Cell(叶单元)

相关阅读​​​​​​​静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 在DC中&#xff0c;leaf cell&#xff08;叶单元&#xff09;有时会出现在描述中&#xff0c;例如set_input_delay的-reference_pin选项的参数&#xff0c;就必须是一个端口或…

怎么将mkv视频格式转为mp4?这四种转换方法你肯定要试试!

怎么将mkv视频格式转为mp4&#xff1f;你是否曾被MKV格式的魅力深深吸引&#xff0c;仿佛踏入了一个充满奇幻色彩的多媒体秘境&#xff0c;那里&#xff0c;音频如溪流潺潺&#xff0c;视频似画卷铺展&#xff0c;字幕则如同夜空中最亮的星&#xff0c;三者交织成一场视听盛宴&…

Doze和AppStandby白名单配置方法和说明

机制 配置路径 配置案例 说明 影响机制 调试命令 Doze /platform/frameworks/base /data/etc/platform.xml allow-in-power-save 【系统应用Doze白名单配置】 Doze\Job\AppStandby\Alarm\WakeLock\Sync 查看Doze白名单:adb shell dumpsys deviceidle 添加Doze白名单…

多输入多输出 | Matlab实现Transformer多输入多输出预测

多输入多输出 | Matlab实现Transformer多输入多输出预测 目录 多输入多输出 | Matlab实现Transformer多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现Transformer多输入多输出预测&#xff08;完整源码和数据&#xff09; 1.da…

OS_同步与互斥

2024-07-04&#xff1a;操作系统同步与互斥学习笔记 第9节 同步与互斥 9.1 同步互斥的基本概念9.1.1 同步关系9.1.2 互斥关系9.1.3 临界资源9.1.4 临界区9.1.5 同步机制应遵循规则 9.2 软件同步机制9.2.1 单标志法9.2.2 双标志先检查法9.2.3 双标志后检查法9.2.4 peterson算法 …

windows安装Docker Desktop及国内镜像

简介 Docker 是一个开源的应用容器引擎&#xff0c;它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。通过Docker工具&#xff0c;简化了应用的部署、配置和管理过程&#xff0c;提高…

Python 核心编程

Python 核心编程 1. 数据类型1.1 整型 int1.2 浮点数 float1.3 布尔类型 bool1.4 字符串 str1.5 列表 list1.6 元组 tuple1.7 集合 set1.8 字典 dict 2. 逻辑结构、文件操作2.1 分支结构和三元表达2.2 循环和遍历2.3 目录和路径2.4 文件操作 3. 函数、类、异常处理3.1 函数3.2 …

int类型变量表示范围的计算原理

文章目录 1. 了解2. 为什么通常情况下int类型整数的取值范围是-2147483648 ~ 21474836473. int类型究竟占几个字节4. 推荐 1. 了解 通常情况下int类型变量占4个字节&#xff0c;1个字节有8位&#xff0c;每位都有0和1两种状态&#xff0c;所以int类型变量一共可以表示 2^32 种状…

p15 p16 c语言实现三子棋

具体的实现代码 game.c #include "game.h"void InitBoard(char board[ROW][COL], int row, int col) {int i 0;int j 0;for (i 0; i < row; i) {for (j 0; j < col; j) {board[i][j] ;}} }void DisplayBoard(char board[ROW][COL], int row, int col) …

C++:组合和继承的区别

组合介绍以及与继承对比 什么是组合 (1)composition&#xff0c;组合&#xff0c;就是在一个class内使用其他多个class的对象作为成员 (2)用class tree做案例讲解 (3)组合也是一种代码复用方法&#xff0c;本质也是结构体包含 #include <iostream> #include <vector…

达梦数据库中的线程和进程

达梦数据库中的线程和进程 在达梦数据库中&#xff0c;线程和进程的概念与操作系统中的定义类似&#xff0c;但有一些特定的实现细节和用途。以下是达梦数据库中线程和进程的一些关键点&#xff1a; 进程&#xff08;Process&#xff09;&#xff1a; 在达梦数据库中&#x…

在亚马逊云科技AWS利用IaC(基础设施即代码)设计和搭建云原生架构(附免费学习教程和证书)

今天小李哥为大家介绍的是利用IaC(基础设施即代码)设计和搭建亚马逊云科技AWS云原生架构。本篇文章将会介绍如何在亚马逊云科技上搭建云原生Serverless服务&#xff0c;所使用的开发服务介绍&#xff0c;并展示搭建云原生架构的cdk代码。小李哥同时会给大家分享快速学习亚马逊云…