城市平均高温、平均低温数据爬取与可视化

爬取历史天气网站数据
在这里插入图片描述
从天气网站爬取指定城市、指定时间范围内的天气数据,并将数据保存为CSV文件。具体而言,它使用了Selenium库来模拟浏览器行为,以便获取动态加载的页面内容。

主要步骤如下:

  • 读取城市信息和代理IP信息,并初始化Chrome浏览器及其设置。
  • 提示用户输入爬取的起始年份、结束年份、起始月份和结束月份。
  • 启动Chrome浏览器调试服务,并创建Chrome驱动。
  • 定义了一个名为crawl_aqi_data()的函数,用于爬取指定城市、指定年份和月份的天气数据,并将数据保存到CSV文件中。在函数内部,它首先构建了目标URL,然后打开URL,等待页面加载完成。接着,创建了保存数据的目录,并打开CSV文件进行写入。在读取数据时,它通过Selenium定位到页面上相应的元素,提取数据,并写入CSV文件。
  • 循环遍历所有城市、年份和月份,调用crawl_aqi_data()函数执行爬取任务,并在每次爬取后休眠1秒。
  • 最后,关闭浏览器,并输出"数据爬取完成。"
  • 需要注意的是,为了避免被网站封禁IP,程序在每次爬取后都会休眠1秒,并且随机选择一个代理IP来访问网站

import os
import time
import subprocess
from selenium import webdriver
from selenium.webdriver.common.by import By
import csv
import pinyin
from fake_useragent import UserAgent
import random

# 读取城市信息
with open("city.txt", "r", encoding="utf-8") as file:
    cities = [line.strip() for line in file if line.strip()]

ips =[]
with open('ip.txt', 'r') as f:
    for line in f:
        ip = line.strip()
        ips.append(ip.strip())


# 输入爬取的起始年份、结束年份、起始月份和结束月份
start_year = int(input("请输入起始年份: "))
end_year = int(input("请输入结束年份: "))
start_month = int(input("请输入起始月份: "))
end_month = int(input("请输入结束月份: "))

# 启动Chrome浏览器调试服务
subprocess.Popen('cmd', shell=True)
subprocess.Popen('"chrome-win64\chrome.exe" --remote-debugging-port=9222', shell=True)

# 创建Chrome驱动
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress", "localhost:9222")
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable‐gpu')
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_argument('--proxy-server=http://' + random.choice(ips))
chrome_options.add_argument(f"user-agent={UserAgent().random}")
driver = webdriver.Chrome(options=chrome_options)

def crawl_aqi_data(city, year,month):
    # 构建URL
    city1 = pinyin.get(city, format="strip")
    url = f"https://m.tianqi.com/lishi/{city1.lower()}/{year}{month:02}.html"
    # 打开URL https://m.tianqi.com/lishi/shanghai/202401.html
    driver.get(url)
    time.sleep(3)  # 等待页面加载完成
    
    # 创建目录
    folder_path = os.getcwd()+f"\data\天气/{city}/{year}年"
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)
    
    # 打开CSV文件
    with open(f"{folder_path}/{year}{month:02}月.csv", "w", newline='', encoding="utf-8") as csvfile:
        writer = csv.writer(csvfile)
        # 写入表头
        #writer.writerow(["日期", "AQI指数", "质量等级", "PM2.5", "PM10", "SO2", "CO", "NO2", "O3-8h"])
        
        # 读取数据并保存到CSV文件
        rows = driver.find_elements(By.CSS_SELECTOR, "body > div.history_weatherct1 > div.count_temp > table > tbody > tr")
        for i, row in enumerate(rows):
            if i == 0:  # 只写入第一行数据
                data = [cell.text for cell in row.find_elements(By.TAG_NAME, "td")]
                if data:
                    print(data)
                    writer.writerow(["平均高温℃","平均低温℃"])
                    writer.writerow([data[0].split("\n")[-1].replace("℃",""),data[1].split("\n")[-1].replace("℃","")])

# 循环爬取指定城市、指定时间段的数据
for city in cities:
    for year in range(start_year, end_year + 1):
        for month in range(start_month, end_month + 1):
            crawl_aqi_data(city, year, month)
            time.sleep(1)
            
            
# 关闭浏览器
driver.quit()

print("数据爬取完成。")

封禁ip
在这里插入图片描述
温度可视化

import os
import pandas as pd
import matplotlib.pyplot as plt

# 读取CSV文件并加载数据
def load_data(file_path):
    if os.path.exists(file_path):
        if os.stat(file_path).st_size == 0:
            print(f"File '{file_path}' is empty.")
            return None
        df = pd.read_csv(file_path)
        return df
    else:
        print(f"File '{file_path}' does not exist.")
        return None

# 可视化数据
def visualize_temperatures(df):

    # 可视化显示
    plt.figure(figsize=(10, 6))

    plt.plot(df['城市'], df['平均高温℃'], marker='o', color='red', linestyle='-', label='平均高温')
    plt.plot(df['城市'], df['平均低温℃'], marker='o', color='blue', linestyle='-')
    plt.xlabel('城市')
    plt.ylabel('温度')
    plt.title('各城市温度对比')
    plt.xticks(rotation=90)  # 旋转x轴标签,以便更好地显示城市名
    plt.grid(True)  # 显示网格线
    plt.tight_layout()  # 调整布局,防止标签重叠
    plt.show()

# 主函数
def main():
    # 设置中文显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    # 指定天气目录路径
    weather_dir = os.path.join(os.getcwd(), 'data', '天气')


    all_df = []

    # 遍历天气目录下的城市数据
    for city_name in os.listdir(weather_dir):
        city_dir = os.path.join(weather_dir, city_name)
        if os.path.isdir(city_dir):
            # 遍历城市文件夹下的所有 CSV 文件
            for year in os.listdir(city_dir):
                year_dir = os.path.join(city_dir, year)
                for csv_file in os.listdir(year_dir):
                    if csv_file.endswith(".csv"):
                        # 构建文件路径
                        file_path = os.path.join(year_dir, csv_file)

                        # 加载数据
                        df = load_data(file_path)
                        # 添加城市列
                        df['城市'] = city_name
                        all_df.append(df)
    rged_df = pd.concat(all_df, ignore_index=True)
    print(rged_df)
    # 可视化数据
    visualize_temperatures(rged_df)

if __name__ == "__main__":
    main()

在这里插入图片描述

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

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

相关文章

Nodejs 第四十九章(lua)

lua Lua是一种轻量级、高效、可嵌入的脚本语言,最初由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)的一个小团队开发而成。它的名字"Lua"在葡萄牙语中意为"月亮",寓意着Lua…

【QT】 QTreeView/QTreeWidget插入文件目录列表

目录 1 QTreeView插入文件目录列表 1.1 自定义默认展开指定路径及文件 1.2 展开指定路径的所有目录及文件 2 QTreeWidget插入文件目录列表 1 QTreeView插入文件目录列表 显示指定磁盘下的目录,简单的方式就是利用QTreeViewQDirModel就可以显示了。 1.1 自定义默认…

05_Mongooes

Mongooes Mongoose是通过Node来操作MongoDB的一个模块。是基于Node.js的第三方模块。 一、Node.js安装 1.解压 2.创建文件夹 解压路径下,创建两个文件夹 node_global:全局安装位置 node_cache:缓存 3.配置 配置环境变量 在path路径…

Open3D(C++) 指定点数的体素滤波

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、算法过程 对于数据量较大的点云,在后期进行配准时会影响计算效率。而体素格网…

03. Nginx入门-Nginx虚拟主机

Nginx虚拟主机简介 yum安装与源码安装一样,只是Nginx配置文件路径不一致,这里用的yum安装的配置文件路径。 利用虚拟主机的功能,可以在一台Nginx服务器上部署一个或多个虚拟主机。 虚拟主机主配置文件 注意:配置完成Nginx主配置…

【如何在Docker中,修改已经挂载的卷(Volume)】

曾梦想执剑走天涯,我是程序猿【AK】 提示:添加投票!!! 目录 简述概要知识图谱 简述概要 如何在Docker中,修改已经挂载的卷(Volume) 知识图谱 在Docker中,修改已经挂载…

基于SSM SpringBoot vue个人博客网站

基于SSM SpringBoot vue个人博客网站 系统功能 首页 图片轮播 博客文章 搜索 登录注册 论坛 留言板 个人中心 我的收藏 后台管理 登录 个人中心 博客分类管理 博客文章管理 论坛管理 系统管理 管理员管理 注册用户管理 开发环境和技术 开发语言:Java 使用框架:…

API 测试- Postman Vs Rest Assured

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程,一周学完让你面试通过率提高90%!(自动化测试) 介绍: 创新和现代化的目标已经从简单的市场差异化转变为更有道德地追求整个社会的进步。提出了新的要求…

03按键控制LED

上回讲到点亮一个LED     这次我们来实现用按键控制led 不带中断的方式 当然实例来源网络 加上自己整合 先熟悉流程 0.添加一个自己写的驱动库文件 为什么添加 笔者想的是一个项目工程希望能适应很多个应用场景需要什么直接在里面调用分装好的函数就行 1.如何添加文件以及…

AI改变游戏规则:内容创作的新时代!

AI技术,尤其是人工智能(AI)在内容创作领域的应用,正开启了一个全新的时代。这一时代的核心在于利用AI的能力,不仅提高内容创作的效率,还能引入前所未有的创新元素,从而彻底改变游戏规则。 AI在…

【北京迅为】《iTOP-3588开发板网络环境配置手册》第1章 网络基础知识学习

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

Stable Diffusion 模型分享:CG texture light and shadow(CG纹理光影)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 一个拥有cg质感和光影的融合模型,偏2.5D 条目内容类型大模型基础模型SD 1.5来…

python--产品篇--游戏-坦克

文章目录 准备代码main.pycfg.py 效果 准备 下载 代码 main.py import os import cfg import pygame from modules import *主函数 def main(cfg):# 游戏初始化pygame.init()pygame.mixer.init()screen pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT))pygame.display.…

2024-03-05

作业要求: 使用write 和 read 实现 文件夹拷贝功能,不考虑递归拷贝使用循环fork的形式。创建一条进程链,链条上总共有100个进程 要求:程序不崩溃 作业1:使用write 和 read 实现 文件夹拷贝功能,不考虑递归拷…

从零学习Linux操作系统 第三十一部分 ansible常用模块介绍

一、ansible运行模块的两种方式 Ad-Hoc方式 ##利用ansible命令直接完成管理,主要用于临时命令使用场景 playbook方式 ##ansible脚本,主要用于大型项目场景,需要前期的规划,相当于shell当中的脚本 二、如何查看模块帮助 ansible…

Java方法重载

重载 概念 重载就是在一个类中,有相同的函数名,但形参不同的函数 规则 方法名称必须相同参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)方法的返回值类型可以相同也可以不同仅仅返回类型不同不足以成为方法的重载 实…

【论文精读】Mask R-CNN

摘要 基于Faster RCNN,做出如下改变: 添加了用于预测每个感兴趣区域(RoI)上的分割掩码分支,与用于分类和边界框回归的分支并行。mask分支是一个应用于每个RoI的FCN,以像素到像素的方式预测分割掩码,只增加了很小的计…

微信小程序云开发教程——墨刀原型工具入门(Axure导入)

引言 作为一个小白,小北要怎么在短时间内快速学会微信小程序原型设计? “时间紧,任务重”,这意味着学习时必须把握微信小程序原型设计中的重点、难点,而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

计算机网络实验一 网线制作

实验目的与要求: 实验目的 了解以太网网线(双绞线)和制作方法 实验内容 了解网线和水晶头 学习网线制作方法 实验环境和要求 网线 水晶头 压线钳 剥线钳 网线测试器 方法、步骤: 步骤一 准备工具和材料 步骤二 剥掉双绞线的外…

【排序】详解归并排序

一、思想 归并排序的核心思想是分治法,即将大问题分解成小问题来解决,然后再将解决后的小问题的结果合并以解决原来的大问题。具体包括以下几个步骤: 分解(Divide):将原始数组不断地二分成更小的子数组&a…