专业服务 · 聪颖博客 —— 内容持续更新,欢迎指正。
技术分享成长记录工具推荐
在线咨询

用Python爬取天气数据并定时推送邮件教程

技术分享分类
2663字数
0阅读
6分钟

前些日子整理自己的代码仓库,翻出了两年前写的一段小脚本。当时为了每天早上能在邮箱里准时看到当天的天气情况,顺手写了一个用 Python 完成的天气爬虫加邮件推送工具。虽然现在很多天气 App 都支持推送,但自己动手实现一遍,对 Python 的网络请求、数据解析和自动化任务调度都会有更直观的理解。这篇文章把当时实现的主要思路和核心步骤做一个梳理,也算是对自己学习过程的一次记录。

整体的实现思路

这个工具的本质可以拆解成三件事:拿到天气数据、整理成可读的文本、通过邮件发送出去。再把这三件事串起来,交给系统的定时任务去触发。

先确定数据来源。当时使用的是某个公开的天气信息网站,这类网站的页面结构相对简单,没有复杂的加密参数,适合用来学习和实践。你可以根据自己的需要换成其他公开数据源,原理是一致的。

然后是三个模块的划分:

数据获取模块
负责请求网页并提取天气信息
内容格式化模块
把天气数据整理成简洁的邮件正文
邮件发送模块
通过 SMTP 协议将邮件发送到指定邮箱

第一步:获取天气数据

获取数据用的库是 `requests`,解析网页则用 `BeautifulSoup`。选这两个库是因为它们足够轻量,而且文档丰富,遇到问题很容易找到参考资料。

基本流程是这样的:

“`python

import requests

from bs4 import BeautifulSoup

url = “你选定的天气信息页面地址”

headers = {

“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36”

}

response = requests.get(url, headers=headers)

response.encoding = “utf-8”

soup = BeautifulSoup(response.text, “html.parser”)

“`

请求网页时要记得带上 User-Agent,否则有些网站会拒绝访问。拿到页面内容之后,需要查看网页源码,找到包含天气信息的 HTML 元素。通常温度、天气状况、风力这些数据都在特定的 class 或 id 里,通过 `soup.select()` 就能把它们提取出来。

有一点需要注意:不同网站的页面结构差别很大,而且网站方偶尔会调整页面布局,所以解析逻辑要做好异常处理。一旦找不到预期的元素,程序不应该直接崩溃,而是应该记录错误日志后退出。

第二步:格式化天气信息

提取到原始数据后,需要整理成适合阅读的文本格式。比如:

“`text

【今日天气】

城市:北京

天气:晴转多云

温度:18℃ ~ 28℃

风力:东南风3级

空气质量:良

“`

这一步其实就是普通的字符串格式化操作,但建议把城市名称、天气描述、温度范围等变量统一管理起来,方便以后修改。也可以考虑用 `jinja2` 模板来渲染邮件正文,这样模板和代码分离,维护起来更清晰。

第三步:发送邮件

邮件发送使用 Python 标准库 `smtplib` 和 `email.mime.text`。需要注意的细节是:大部分邮箱服务商要求在 SMTP 连接时使用授权码而不是登录密码,这个授权码需要在邮箱设置里单独开启。

核心代码如下:

“`python

import smtplib

from email.mime.text import MIMEText

from email.header import Header

msg = MIMEText(mail_content, “plain”, “utf-8”)

msg[“Subject”] = Header(“今日天气推送”, “utf-8”)

msg[“From”] = sender_email

msg[“To”] = receiver_email

server = smtplib.SMTP_SSL(“smtp.你的邮箱服务商.com”, 465)

server.login(sender_email, auth_code)

server.send_message(msg)

server.quit()

“`

建议把收件人设置成自己的常用邮箱,这样即使人在外面,手机也能直接收到推送。

第四步:配置定时任务

到这里脚本本身已经可以独立运行了。要让它每天早上自动执行,就需要借助系统自带的定时工具。

  • Windows 环境:使用任务计划程序,创建一个每日任务,触发时间设为早上 7 点,操作指向 `python.exe` 和脚本路径。
  • macOS / Linux 环境:使用 crontab,例如 `30 7 * * * python3 /path/to/your_script.py` 表示每天早上 7 点 30 分执行一次。

配置定时任务时,建议先在终端手动运行一次脚本,确认没有任何报错后再配置到系统里。因为定时任务运行时的环境变量和终端里可能不完全一致,容易出现找不到模块的情况。

写在最后

整个项目从开始到跑通大约用了一个周末的时间,期间遇到的主要问题集中在网页解析和 SMTP 授权码这两块。网页解析需要一点耐心去查看 HTML 结构,而 SMTP 授权则是纯粹的经验问题,第一次接触的人可能会卡一会儿。

这个脚本的基本框架具有很好的扩展性。如果想继续深挖,可以把天气数据存入本地数据库,用来做长期的统计分析;或者改成多个城市同时推送,方便关注家人所在城市的天气。Python 的生态里各种现成的库都很丰富,只要迈出第一步,后面能玩出的花样还有很多。

泰州市喃彰坪鞋帽批发有限公司 苏ICP备2026071437号-3