Python实现爬虫:天气数据抓取(+折线图)

一、基本架构

1、URL管理器:爬虫的调度中枢

 核心职责
功能说明
URL去重防止重复抓取
URL优先级管理控制抓取顺序(广度优先/深度优先)
断点续爬支持持久化存储抓取状态
分布式协同多节点共享URL队列

2、网页下载器:数据获取的引擎

功能实现方式
请求模拟随机User-Agent/Cookie管理
代理管理代理IP池+自动检测可用性
流量控制自适应QPS限制
异常处理自动重试+熔断机制
反反爬策略TLS指纹伪装+请求随机延时

3、网页解析器:信息提取的核心

技术适用场景示例
XPath结构化页面//div[@class='content']
CSS选择器简单页面div.content > p.text
正则表达式非结构化文本\d{4}-\d{2}-\d{2}
OCR识别验证码/图片文字Tesseract引擎
深度学习复杂语义抽取BERT模型

二、代码展示

数据展示

代码展示

"""
烟台市历史天气数据爬取及可视化
功能:从天气网站爬取2011-2012年数据,生成Excel表格并绘制气温折线图
"""# ==================== 库导入 ====================
import requests  # 网络请求库
from bs4 import BeautifulSoup  # HTML解析库
import pandas as pd  # 数据处理库
import time  # 时间模块(用于延迟)
import random  # 随机数模块(用于随机延迟)
import matplotlib.pyplot as plt  # 绘图库
import matplotlib.dates as mdates  # 日期格式化模块# ==================== 数据爬取函数 ====================
def save_a_month_data(url):"""获取单个月份的天气数据:param url: 目标页面URL (格式: http://lishi.tianqi.com/yantai/YYYYMM.html):return: 二维列表,包含该月每天的天气数据"""a_month = []headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"}try:# 发送带超时设置的GET请求(连接超时10秒,读取超时30秒)r = requests.get(url, headers=headers, timeout=(10, 30))r.raise_for_status()  # 检查HTTP状态码,非200会抛出异常except requests.exceptions.RequestException as e:print(f"请求失败:{url},错误:{e}")return a_month  # 返回空列表# 使用BeautifulSoup解析HTMLsoup = BeautifulSoup(r.text, 'html.parser')tianqi_zone = soup.find(class_='tian_three')  # 定位天气数据区域try:tianqi_data = tianqi_zone.find(class_='thrui')  # 定位数据列表except AttributeError:print(f"页面结构异常:{url}")return a_month# 提取每日数据(每个<li>标签代表一天)tianqi_data_a_month = tianqi_data.find_all('li')# 数据清洗处理for tianqi_data_a_day in tianqi_data_a_month:data = tianqi_data_a_day.text.split()  # 按空白字符分割文本# 处理异常格式:当某天有空气质量数据时字段数为7if len(data) == 7:data.pop(1)  # 移除第二个元素(原始数据中的冗余字段)a_month.append(data)return a_month# ==================== 主程序:数据爬取 ====================
all_data = []  # 存储所有月份的数据# 注意:range的结束值不包含,2011-2012年应写range(2011, 2013)
for year in range(2011, 2013):  # 修正后的年份范围for month in range(1, 13):month_str = f"{year}{month:02d}"  # 格式化月份为两位数(如201101)url = f"http://lishi.tianqi.com/yantai/{month_str}.html"print(f"正在抓取:{url}")# 调用爬取函数并合并数据a_month_data = save_a_month_data(url)all_data += a_month_data# 随机延迟(1~3秒)防止触发反爬机制time.sleep(random.uniform(1, 3))# ==================== 数据保存 ====================
# 注意:如果桌面已存在weather_data.xlsx文件,需先关闭该文件
df = pd.DataFrame(all_data, columns=["日期", "最高温", "最低温", "天气", "风力风向", "空气质量"])
df.to_excel("C:/Users/lenovo/Desktop/weather_data.xlsx", index=False)
print("数据已保存至桌面")# ==================== 数据可视化 ====================
# 重新读取数据(避免修改原始数据影响后续操作)
df = pd.read_excel("C:/Users/lenovo/Desktop/weather_data.xlsx")# ---------- 数据预处理 ----------
# 1. 转换日期格式(将字符串转为datetime类型)
df['日期'] = pd.to_datetime(df['日期'])
# 2. 清洗温度数据(去除℃符号并转为浮点数)
df['最高温'] = df['最高温'].str.replace('℃', '').astype(float)
df['最低温'] = df['最低温'].str.replace('℃', '').astype(float)# 筛选指定时间段数据
mask = (df['日期'] >= '2011-01-01') & (df['日期'] <= '2012-12-31')
df_filtered = df.loc[mask]# ---------- 图表配置 ----------
# 设置中文字体(Windows系统使用SimHei)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 创建画布(单位:英寸,15x6英寸≈38x15厘米)
plt.figure(figsize=(15, 6))# ---------- 绘制折线图 ----------
# 绘制最高温曲线(颜色代码:橙红色)
plt.plot(df_filtered['日期'], df_filtered['最高温'],label='最高温', color='#FF4500', linewidth=1.2)
# 绘制最低温曲线(颜色代码:道奇蓝)
plt.plot(df_filtered['日期'], df_filtered['最低温'],label='最低温', color='#1E90FF', linewidth=1.2)# ---------- 图表美化 ----------
plt.title("烟台市气温变化 (2011-2012)", fontsize=14, pad=20)  # pad标题间距
plt.xlabel("日期", fontsize=12, labelpad=10)  # labelpad标签间距
plt.ylabel("温度 (℃)", fontsize=12, labelpad=10)
plt.grid(linestyle=':', color='gray', alpha=0.7)  # 虚线网格# 设置x轴日期格式
ax = plt.gca()  # 获取当前坐标轴
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))  # 显示年月
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=2))  # 每2个月一个主刻度
plt.xticks(rotation=45, ha='right')  # 标签旋转45度,右端对齐# 添加图例(无边框,右上角位置)
plt.legend(loc='upper right', frameon=False)# 自动调整子图参数(避免标签被截断)
plt.tight_layout()# ---------- 保存与显示 ----------
# 保存高清图片(dpi=300为印刷级清晰度)
plt.savefig("C:/Users/lenovo/Desktop/2011-2012_temperature.png",dpi=300, bbox_inches='tight')  # bbox_inches='tight'去除白边
plt.show()  # 显示图表窗口

三、结果展示

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

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

相关文章

DFS刷题

洛谷P2089烤鸡 #include<iostream> using namespace std; const int N 20, M 1000010; int ans[N]; int dp[M][N]; int n, count; void dfs(int x, int sum){if(sum > n)return;if(x > 10){if(sum n){count;for(int i 1; i < n; i)dp[count][i] ans[i];}r…

《Operating System Concepts》阅读笔记:p460-p4470

《Operating System Concepts》学习第 36 天&#xff0c;p460-p4470 总结&#xff0c;总计 11 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;3) 1.lifespan (1)lifespan: life span(“the period of time that sth exists or happens”) c. 也写作 life-span, …

stratis,容器podman

一、stratis 1.stratis可以实现动态的在线扩容&#xff0c;lvm虽然也可以实现在线扩容&#xff0c;但是是需要人为的手动扩容。 2.stratis不需要手动格式化&#xff0c;自动会创建文件系统&#xff08;默认是xfs&#xff09; 1. 安装stratis软件包 yum list | grep stratis…

音频焦点 Android Audio Focus

Android 音频焦点详解 音频焦点&#xff08;Audio Focus&#xff09;是 Android 系统用于协调多个应用同时访问音频输出的机制。当多个应用需要播放音频时&#xff0c;音频焦点确保用户听到的内容不会混乱&#xff08;如多个音乐应用同时播放&#xff09;。以下从核心概念、使…

【用 Trace读源码】PlanAgent 执行流程

前提条件 在 Trae 中打开 OpenManus 工程&#xff0c;使用 build 模式&#xff0c;模型选择 claude-sonnet-3.7 提示词 分析 agent/planning.py 中 main 方法及相关类的执行流程&#xff0c;以流程图的方式展示PlanningAgent 执行流程图 以下流程图展示了 PlanningAgent 类…

1、双指针法

关于每个知识点的例题 可以自己看力扣标准题解。也可以在哔哩哔哩上看。想看我的&#xff0c;就到github 看 - 库 &#xff0c;介绍里写的算法讲解那些&#xff0c;里面有知识点&#xff0c;有题库。题库&#xff0c;每天都发题&#xff0c;可能跟博客的进度不一样。因为我上传…

LangChain 基础

一、LangChain 模块和体系 LangChain 是一个用于开发由大型语言模型&#xff08;LLMs&#xff09;驱动的应用程序的框架。 官方文档&#xff1a;https://python.langchain.com/docs/introduction/ LangChain 简化了LLM应用程序生命周期的每个阶段&#xff1a; 开发&#xf…

#echarts#折线图#饼图

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>折线图</title> </head> <body><div id"app" style"width:100%;height:100%;"><div id"chart-c…

Parsing error: Unexpected token, expected “,“

今天在使用Trae AI 编程工具开发大文件切片上传功能&#xff0c;使用的是VUE3,TS技术栈&#xff0c;开发完成运行时&#xff0c;编译报错&#xff08;Parsing error: Unexpected token, expected ","&#xff09;&#xff0c;让AI自行修复此问题多次后还是没有解决&a…

NLP高频面试题(九)——大模型常见的几种解码方案

大模型常见的几种解码方案 在自然语言生成任务中&#xff0c;如何从模型生成的概率分布中选择合适的词汇&#xff0c;是影响文本质量的关键问题。常见的解码方法包括贪心搜索&#xff08;Greedy Search&#xff09;、束搜索&#xff08;Beam Search&#xff09;、随机采样&…

农用车一键启动工作原理

移动管家农用车一键启动的工作原理与普通汽车类似&#xff0c;主要依赖于无线射频识别技术&#xff08;RFID&#xff09;。以下是具体的工作步骤和原理&#xff1a; 智能钥匙识别&#xff1a; 车主携带智能钥匙靠近车辆时&#xff0c;钥匙通过发射射频信号与车辆进行交互。车辆…

Cursor从小白到专家

文章目录 1&#xff1a;简单开发一个贪吃蛇游戏规则设置提示词 cursor开发小工具开发整体步骤创建.cursorrules输入提示词composer模式chat模式 执行cursor accept all发布到线上进行分享 cursor开发一个浏览器插件创建.cursorrulescursor rules范例集工具 输入提示词执行curso…

MAC+PHY 的硬件连接

文章目录 以太网的 MAC 与 PHY简介硬件拓扑CPU集成MAC与PHYCPU集成MAC&#xff0c;PHY采用独立芯片CPU不集成MAC与PHY&#xff0c;MAC与PHY采用集成芯片 在 OSI 分层中的位置MACPHYMAC 与 PHY 数据交互参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记&#xff0c;文末均…

仿函数 VS 函数指针实现回调

前提&#xff1a; 本博客对比 函数指针实现回调 和 仿函数 &#xff0c;突出仿函数的优势。 目的&#xff1a; 一个类要能够灵活的调用两个函数&#xff0c;essfc 和 greaterfc&#xff0c;分别用于比较两个整数的大小&#xff1a; ①&#xff1a;lessfc&#xff1a;判断 x …

CH32V208蓝牙内部带运放32位RISC-V工业级微控制器

开发板 CH32V208CBU6立创格式的开发板上述链接可下载&#xff0c;官方文件进行了转换&#xff0c;使用前请仔细核对。 CH32V208CBU6原理图&#xff0c;上述图片为芯片部分。已进行DRC。 CH32V208CBU6 PCB三维图&#xff0c;上述图片为芯片部分。已进行DRC。 概述 CH32V208C…

整理和总结微信小程序的高频知识点

前言 近期萌生了一些想法&#xff0c;感觉可以做一个小程序作为产出。 但小程序做得比较少&#xff0c;因此边做边复习。整理和总结了一些高频知识点和大家一起分享。 一、模板和组件 1.1模板&#xff08;Template&#xff09; 优势 简单灵活&#xff1a;模板定义和使用都较…

1996-2023年各省公路里程数据(无缺失)

1996-2023年各省公路里程数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1996-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;公路里程&#xff08;万公里&#xff09; 4、范围&#xff1a;31省 5、指标解释&#xff1a;公路里程指报告期末…

SEARCH-R1:大型语言模型的多轮搜索推理革命

当AI学会"边搜索边思考" 2025年&#xff0c;语言模型领域迎来重大突破——SEARCH-R1框架通过强化学习&#xff08;RL&#xff09;让大模型实现"动态搜索自主推理"的协同进化。这项技术不仅让模型在回答"泰坦尼克号沉没时的船长是谁"时能自动检索…

Wi-Fi NAN 架构(Wi-Fi Aware Specification v4.0,第2章:2.7~2.9)

1. NAN 介质访问控制层&#xff08;MAC&#xff09; NAN MAC负责通过参与 NAN同步信标帧&#xff08;NAN Synchronization Beacon frame&#xff09;的传输&#xff0c;获取并维护设备所在的NAN集群的同步。作为同步功能的一部分&#xff0c;NAN MAC运行 TSF 定时器。NAN MAC还…

基于物联网的便携式土壤综合参数检测仪设计

标题:基于物联网的便携式土壤综合参数检测仪设计 内容:1.摘要 随着农业现代化和环境监测需求的不断增长&#xff0c;对土壤综合参数的实时、准确检测变得至关重要。本研究旨在设计一种基于物联网的便携式土壤综合参数检测仪&#xff0c;以满足现场快速检测和数据远程传输的需求…