[python应用案例] 一.BeautifulSoup爬取天气信息并发送至QQ邮箱

2023-10-28

前面作者写了很多Python系列文章,包括:

这里写图片描述 这里写图片描述 这里写图片描述

接下来作者将学习并讲解一些Python小应用,它将结合Python爬虫、数据分析、web开发或其他功能进行介绍。一方面希望能提升读者的Python学习兴趣,另一方面也希望读者能学到些知识,做些好玩的应用。本篇文章主要讲解BeautifulSoup爬取每日天气信息,然后将信息发送至QQ邮箱,其难点是如何配置QQ邮箱发送Python邮件。
基础性应用文章,希望对您有所帮助,如果文章中出现错误或不足之处,还请海涵~


一. BeautifulSoup爬取天气信息

1.分析网页

中国天气网: http://www.weather.com.cn/weather/101260101.shtml
我们需要爬取贵阳市当天的天气信息,比如“5月3日 阵雨 18/15℃”


接下来通过浏览器审查元素,可以看到这些信息位于<li class="sky skyid lv3 on">元素下,接着我定义class为“wea”和“tem”的元素进行定位,核心代码为:
name = soup.find_all(attrs={"class":"sky skyid lv3 on"})



2.完整代码

# -*- coding: UTF-8 -*-
import urllib
import urllib.request
from bs4 import BeautifulSoup

#下载数据
url = "http://www.weather.com.cn/weather/101260101.shtml"
content = urllib.request.urlopen(url).read()
soup = BeautifulSoup(content,"html.parser")
#print(soup.title.get_text())

content = ""
name = soup.find_all(attrs={"class":"sky skyid lv3 on"})
for u in name:
    wea = u.find(attrs={"class":"wea"}).get_text()
    tem = u.find(attrs={"class":"tem"}).get_text()
    content = "天气:" + wea + " 温度:" + tem
    content = content.replace("\n","")
    print(content)

输出结果如下图所示:




二. QQ邮箱设置STMP

在使用Python自动发送邮件之前,需要对我们的QQ邮箱进行简单的配置,过程如下:

1.首先登陆QQ邮箱,选择“账户”如下图所示:



2.在账户页面往下拉,看到“POP3/SMTP”设置,点击开启按钮,如下图所示:



3.弹出如下图所示界面,然后发送这条短信至指定号码,点击“我已发送”按钮。



4.弹出的提示中会显示16位授权码,注意一定要记住这个授权码,后面写Python代码也需要,然后点击“确定”按钮。



5.接下来将收取选项设置为“全部”,并点击“保存”按钮即可。注意端口号如下:




三. Python自动发送邮件

Python 的 email 模块里包含了许多实用的邮件格式设置函数,可以用来创建邮件“包裹”。使用的 MIMEText 对象,为底层的 MIME(Multipurpose Internet MailExtensions,多用途互联网邮件扩展类型)协议传输创建了一封空邮件,最后通过高层的SMTP 协议发送出去。 MIMEText 对象 msg 包括收发邮箱地址、邮件正文和主题,Python 通过它就可以创建一封格式正确的邮件。smtplib 模块用来设置服务器连接的相关信息。

Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:(参考: Python SMTP发送邮件

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])

参数说明:

  • from_addr: 邮件发送者地址。
  • to_addrs: 字符串列表,邮件发送地址。
  • msg: 发送消息

这里要注意一下第三个参数,msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。


代码如下:
# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header

#发送邮件
msg_from = "1455136241@qq.com"
#授权码(而不是密码)
EMAIL_HOST_PASSWORD = '****htacisgv****'
#接受邮件
msg_to = "15201615157@163.com"
#主题
subject = "Python测试代码"
#正文
content = "女神,这是我使用python smtplib及email模块发送的邮件。"
print(content)

#MIMEText构建对象 参数分别是:邮件正文、MIMEsubtype中'plain'表示纯文本、utf-8编码
msg = MIMEText(content, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = msg_from
msg['To'] = msg_to

#邮件服务器及端口号
#smtplib.SMTPServerDisconnected: Connection unexpectedly closed
try:
    s = smtplib.SMTP_SSL("smtp.qq.com",465) #端口号
    s.set_debuglevel(1)
    s.login(msg_from, EMAIL_HOST_PASSWORD)
    s.sendmail(msg_from, msg_to, msg.as_string())
    print("发送成功")
except s.SMTPException.e:
    print("发送失败")
    print(e)
finally:
    s.quit()

发送成功之后如下图所示,注意login()输入邮箱名和授权码,而不是密码。


运行过程输出内容如下:

>>> 
女神,这是我使用python smtplib及email模块发送的邮件。
send: 'ehlo [192.168.0.101]\r\n'
reply: b'250-smtp.qq.com\r\n'
reply: b'250-PIPELINING\r\n'
reply: retcode (250); Msg: b'smtp.qq.com\nPIPELINING\'
send: 'AUTH PLAIN ADE0NTUxMzYyNDFAcXEuY29tAGVveXFodGFjaXNndmlmYmg=\r\n'
reply: b'235 Authentication successful\r\n'
reply: retcode (235); Msg: b'Authentication successful'
send: 'mail FROM:<1455136241@qq.com> size=296\r\n'
reply: b'250 Ok\r\n'
reply: retcode (250); Msg: b'Ok'
send: 'rcpt TO:<15201615157@163.com>\r\n'
reply: b'250 Ok\r\n'
reply: retcode (250); Msg: b'Ok'
send: 'data\r\n'
reply: b'354 End data with <CR><LF>.<CR><LF>\r\n'
reply: retcode (354); Msg: b'End data with <CR><LF>.<CR><LF>'
data: (354, b'End data with <CR><LF>.<CR><LF>')
send: b'Content-Type: text/plain; charset="utf-8"\r\nMIME-Version: 1.0\r\n...r\nTo: 15201615157@163.com\r\n'
reply: b'250 Ok: queued as \r\n'
reply: retcode (250); Msg: b'Ok: queued as'
data: (250, b'Ok: queued as')
发送成功
send: 'quit\r\n'
reply: b'221 Bye\r\n'
reply: retcode (221); Msg: b'Bye'
>>> 


四. 完整代码实现

完整代码如下所示:

# -*- coding: UTF-8 -*-
import urllib
import urllib.request
from bs4 import BeautifulSoup

#下载数据
url = "http://www.weather.com.cn/weather/101260101.shtml"
content = urllib.request.urlopen(url).read()
soup = BeautifulSoup(content,"html.parser")
content = ""
name = soup.find_all(attrs={"class":"sky skyid lv3 on"})
for u in name:
    wea = u.find(attrs={"class":"wea"}).get_text()
    tem = u.find(attrs={"class":"tem"}).get_text()
    content = "天气:" + wea + " 温度:" + tem
    content = content.replace("\n","")
    print(content)

#发送邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header

msg_from = "1455136241@qq.com"
EMAIL_HOST_PASSWORD = '****htacisgv****'
msg_to = "15201615157@163.com"
subject = "Python爬取天气"
other = content + "\n这是我使用python smtplib及email模块发送的邮件。"
print(other)

msg = MIMEText(other,'plain','utf-8')
msg['Subject'] = subject
msg['From'] = msg_from
msg['To'] = msg_to

try:
    s = smtplib.SMTP_SSL("smtp.qq.com",465)
    s.set_debuglevel(1)
    s.login(msg_from, EMAIL_HOST_PASSWORD)
    s.sendmail(msg_from, msg_to, msg.as_string())
    print("发送成功")
except s.SMTPException.e:
    print("发送失败")
    print(e)
finally:
    s.quit()

发送成功之后如下图所示:

需要注意,代码有时能发送成功,有时报错“smtplib.SMTPServerDisconnected: Connection unexpectedly closed”,网上说是设置端口465的原因,但作者已经设置了的,不知道为什么?希望博友帮忙。

 (By:Eastmount 2018-5-3 下午4点   http://blog.csdn.net/eastmount/


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[python应用案例] 一.BeautifulSoup爬取天气信息并发送至QQ邮箱 的相关文章

随机推荐

  • minikube 部署的 k8s 集群准备 kubeconfig 文件

    CSDN 中文章不一定能及时更新 欢迎点击前往我的博客查看最新版本 许盛的博客 题外话 最近大出血 换了 m1pro 黑苹果就暂时没啥用了 本来准备装个 ubuntu 用来部署 kubesphere 玩玩的 不过在尝试了 ubuntu 官方
  • margin重叠问题、 解决办法

    margin重叠问题 两个块级元素的上外边距和下外边距可能会合并 折叠 为一个外边距 其大小会取其中外边距值大的那个 这种行为就是外边距折叠 重叠只会出现在垂直方向 解决办法 兄弟之间重叠
  • 联邦学习-区块链论文笔记:Blockchained On-Device Federated Learning

    链接 IEEE Xplore Full Text PDF ieeexplore ieee org stamp stamp jsp tp arnumber 8733825 作者 Hyesung Kim 延世大学团队 一点感悟 区块链和联邦学习
  • 2021年暑假康复性训练(Codeforces Round #731 (Div. 3))全题解

    2021暑假康复性训练 Codeforces Round 731 Div 3 A Shortest Path with Obstacle B Alphabetical Strings C Pair Programming D Co grow
  • libboost_system.so.xxx: cannot open shared object file: No such file or directory

    遇见这个错误说明没找到libboost system so xxx文件 1 查看 usr local lib下是否有这个库文件 有的话说明已经安装了libboost system 没有说明没有安装 2 若没有安装就下载个安装包 安装好 再测
  • C语言的员工管理系统

    include
  • Mac操作系统下 命令行 cp命令的坑

    Mac系统下的命令与Linux系统下的命令大部分是一样的 但是有一些事不同的用法 有的时候找个命令在Linux下好使 在Mac下就不好使 下面来研究下cp命令在Mac系统下的坑 Mac MacBook Pro mac mkdir aa Ma
  • Your build is currently configured to use Java 17.0.6 and Gradle 5.6.4.

    报错信息 Unsupported Java Your build is currently configured to use Java 17 0 6 and Gradle 5 6 4 Possible solution Upgrade G
  • C++ abort() has been called错误

    程序可以成功编译 说明没有语法问题 应是代码内部的问题 报错如下 abort has been called 中止被调用 该错误出现有很多原因 查询了多条博客后 发现一卒2018博主已经在博客上总结了几条原因和解决办法 谢谢博主 借博主的思
  • JAVA容器学习-集合

    Java集合是我认为在Java基础中最最重要的知识点了 Java集合是必须掌握的 我在实习 秋招面试的时候 只要是面到Java 那一定是少不了Java集合 作为一个新人 最关心的其实有一点 这个技术在工作中是怎么用的 换个说法 工作中常用到
  • 如何在BIOS中开启虚拟化技术

    虚拟化技术目前主要依赖于您电脑的CPU型号及BIOS 某些CPU或者BIOS暂时还不能支持虚拟化技术 支持虚拟化技术的可以在BIOS中开启 开启方法如下 1 进入BIOS 开机时按F2或F12或DEL或ESC等键 各电脑有所不同 2 进入B
  • jmeter安装和压力测试

    一 安装 1 1 下载安装包 1 2 解压到指定目录 1 3 配置环境变量 JMETER HOME D java apache jmeter 5 1 1 CLASSPATH JMETER HOME lib ext ApacheJMeter
  • React利用路由实现登录界面的跳转

    React利用路由实现登录界面的跳转 上一篇在配置好了webpack和react的环境后 接下来开始写登录界面 以及接下来的跳转到主页的功能 1 首先看一下总体的目录结构 因为很多时候在看别人写的例子的时候因为目录结构不熟悉后边会出现意想不
  • Android RecyclerView BaseSectionQuickAdapter实现分组功能

    详情网站 手把手教你使用BaseSectionQuickAdapter实现分组功能 史上最详细Adapter使用教程 basequickadapter 分组 杨阿程的博客 CSDN博客 加入二个包 implementation com an
  • Python 文件读取操作

    视频版教程 Python3零基础7天入门实战视频教程 文件IO操作 Python的内置库提供了对文件的IO操作 可以对文件进行打开 读 写 关闭等操作 文件读取操作 你必须先用Python内置的open 函数打开一个文件 创建一个file对
  • 软件工程 数据流图(DFD)变换型与事务型的分析

    在系统分析阶段 我们采用结构化分析方法得到了由数据流图 数据字典和加工说明等组成的系统的逻辑模型 现在 可根据一些规则从数据流图导出系统初始的模块结构图 管理信息系统的数据流图通常也可分为两种典型的结构 即变换型结构和事务型结构 变换型结构
  • 10-Java框架-SpringBoot整合MyBatis-Plus

    一 MyBatis Plus介绍 官网 https baomidou com MyBatis Plus 简称 MP 是一个 MyBatis的增强工具 在 MyBatis 的基础上只做增强不做改变 无侵入式 为简化开发 提高效率而生 MyBa
  • H5 打开微信小程序 公众号

    1 打开公众号的方式 https mp weixin qq com mp profile ext action home biz 公众号BASE64ID scene 110 wechat redirect base64ID 寻找方式 转发任
  • 基于 SpringBoot+Vue+Java 的高校招生管理系统(数据库+源码和教程)

    文章目录 简介 系统设计思路 1 数据库设计 2 系统整体设计 2 1 系统设计思想 2 2系统流程图 系统详细设计 1系统功能模块 2 管理员功能模块 3学生功能模块 简介 本次设计任务是要设计一个高校招生管理系统 通过这个系统能够满足管
  • [python应用案例] 一.BeautifulSoup爬取天气信息并发送至QQ邮箱

    前面作者写了很多Python系列文章 包括 Python基础知识系列 Python基础知识学习与提升 Python网络爬虫系列 Python爬虫之Selenium Phantomjs CasperJS Python数据分析系列 知识图谱 w