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

爬取历史天气网站数据
在这里插入图片描述
从天气网站爬取指定城市、指定时间范围内的天气数据,并将数据保存为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):# 构建URLcity1 = 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.htmldriver.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 Nonedf = pd.read_csv(file_path)return dfelse: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_nameall_df.append(df)rged_df = pd.concat(all_df, ignore_index=True)print(rged_df)# 可视化数据visualize_temperatures(rged_df)if __name__ == "__main__":main()

在这里插入图片描述

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

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

相关文章

html样式排版

<template><div class"box"><div class"header">头部</div><div class"main"><div class"left">菜单</div><div class"right"><div class"right-contentr"&g…

超分之Real-ESRGAN官方代码解读

文章目录 高阶退化过程生成用于一阶、二阶退化过程的各种模糊核&#xff0c;以及sinc滤波器具体的一阶、二阶退化过程 高阶退化过程 生成用于一阶、二阶退化过程的各种模糊核&#xff0c;以及sinc滤波器 文件位置 “basicsr/data/realesrgan_dataset.py” # ------------------…

中国企业走向世界,新加坡共和理工学院师生首站到访开源网安交流

近年来&#xff0c;中国企业在众多领域突飞猛进&#xff0c;不断追赶国际头部企业技术水平&#xff0c;甚至在某些领域已经达到国际领先水平&#xff0c;国内企业的最佳实践逐渐成为了全球精英学习研究的对象。 3月4日&#xff0c;由新加坡五所国立理工学院之一的新加坡共和理工…

HarmonyOS—编译构建概述

编译构建是将应用/服务的源代码、资源、第三方库等&#xff0c;通过编译工具转换为可直接在硬件设备上运行的二进制机器码&#xff0c;然后再将二进制机器码封装为HAP/APP软件包&#xff0c;并为HAP/APP包进行签名的过程。其中&#xff0c;HAP是可以直接运行在模拟器或真机设备…

[数据集][图像分类]芒果叶病害分类数据集4000张5类别

数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;4000 分类类别数&#xff1a;8 类别名称:["anthracnose","bacterial_canker","cutting_weevil","die_back",&…

Cesium 问题:[Violation]‘requestAnimationFrame‘ handler took 58ms

文章目录 问题分析解决问题 Cesium 在引入页面后,控制台弹出提示信息: [Violation]requestAnimationFrame handler took 58ms分析 这个警告信息表明使用 requestAnimationFrame 方法时,其处理函数执行所需的时间超过了一定阈值,从而触发了警告。requestAnimationFrame 方…

Python算法题集_分割回文串

Python算法题集_分割回文串 题131&#xff1a;分割回文串1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【参数回退回溯单行回文检测】2) 改进版一【参数回退回溯lambda回文检测】3) 改进版二【参数回退回溯函数回文检测】4) 改进版三【堆栈回退…

2024-简单点-picamera2除了文档还有哪里可以学习实例?

picamera2学习例子 去github的picamera2库&#xff0c;找app和examples目录&#xff0c;然后学习

UCSF DOCK 分子对接详细案例(05)- 遗传算法用于分子生成 DOCK_GA

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、软件及操作环境二、遗传算法三、结构文件准备四、 DOCK_GA4.1 Fragment Library Generation4.2 运行 GA没有RDKit编译的情况RDKit编译的情况在服务器上运行 总结参考资料 前言 本文是UCSF DOC…

抖音视频批量下载工具|视频评论采集软件

独特功能一&#xff1a;关键词搜索&#xff0c;批量提取视频 不再受单个视频链接限制&#xff0c;我们的工具支持通过关键词进行视频搜索&#xff0c;实现批量、有选择性的提取。操作简单便捷&#xff0c;只需输入想要搜索的视频关键词&#xff0c;点击开启抓取即可开始搜索&am…

记本科中的第一堂美术课

我上大学后上课向来不喜欢坐前排&#xff0c;不管是公共课还是专业课&#xff0c;因为我觉得坐后排也是一样地听课。 雨越下越大&#xff0c;风越吹越冷&#xff0c;旁边的车辆像阵风似的从我旁边飞过&#xff0c;我骑着电动在这条六车道上忐忑地行驶&#xff0c;“这导航到底…

c++|内存管理

c|内存管理 C/C内存分布strlen 和 sizeof的区别 c语言动态内存管理方式malloccallocrealloc例题 c管理方式new/delete操作内置类型new/delete操作自定义类型证明 new 和 delete 的底层原理operator new与operator delete函数operator new 和 operator delete的 用法构造函数里面…