使用python实现定时报天气的示例代码
作者:弈鸣coding 发布时间:2021-12-27 14:56:10
前言
如果你和我一样偶尔看看股票,看看自己关注的股票是涨了还是跌了,或者想快速获取到想看的头条新闻,我们不必把过多的注意力放在去寻找上面,我们只需要让爬虫程序每天自动为你发送你想要了解的信息就可以了,这样就能掌控我们的注意力,更好的去享受生活。
一.分析爬取目标
这里就不爬取股票的信息,我来爬一个天气预报的信息,然后实现每天定时发送。打开下面的链接就能跳转到中国气象网
http://www.weather.com.cnnn/
点击温度那个位置就可以进入下面的图
我们可以看到7天的天气和8-15天的天气,再往后对我们来说就没必要了。我们查看七日的天气预报,直接爬11日的天气,鼠标右键->检查->Network->刷新网页->查看列表第一个,再点击preview
可以看到数据在HTML里面,然后回到element
可以发现,温度数据放在<p class="tem">
之下。“多云”所在的位置是<p title="晴" class="wea">晴</p>
。
import requests
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36'}
# 封装headers
#这里对应的是我选的城市,可以换自己所在城市
url = 'http://www.weather.com.cn/weather/101010100.shtml'
# 把URL链接赋值到变量url上
res = requests.get(url, headers=headers)
# 发送requests请求,并把响应的内容赋值到变量res中。
print(res.text)
# 打印出res对象的网页源代码
print(res.status_code)
# 检查响应状态是否正常
看结果可以看到是响应是正常的,但是出现了乱码。但是莫慌。加上一句res.encoding='utf-8'
就行了。
接下来就可以写完整的爬取信息的代码了
import requests
from bs4 import BeautifulSoup
headers={'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36'}
#封装headers
url='http://www.weather.com.cn/weather/101010100.shtml'
#把URL链接赋值到变量url上
res=requests.get(url,headers=headers)
#发送requests请求,并把响应的内容赋值到变量res中
res.encoding='utf-8'
bsdata=BeautifulSoup(res.text,'html.parser')
#使用bs模块解析获取到的数据
data_temperature= bsdata.find(class_='tem')
#使用find()取出天气的温度数据
data_weather= bsdata.find(class_='wea')
#使用find()取出天气的文字描述
print(data_temperature.text)
#取出变量data_temperature中的字符串内容,并打印
print(data_weather.text)
#取出变量data_weather中的字符串内容,并打印
可以成功的得到需要的数据。
其实最难的不是爬虫,爬这种信息新手应该都会,接下里才是重头戏。
二.信息的发送
如果我们想要实现发送邮件,这里以qq邮件为例要经过以下的步骤:
连接邮件服务器
使用邮箱账号密码登录
填写收件人,主题,正文等
发送邮件
所以连接服务器要用到用到smtplib库,填写主题和撰写正文,需要用到email库(python真的是yyds)
1.连接服务器
SMTP代表简单邮件传输协议,相当于一种计算机之间发邮件的约定
smtplib是不需要安装的,smtplib是python的一个内置库,有兴趣的小伙伴可以看看官方文档
看下面的代码
import smtplib
mailhost='smtp.qq.com'
#把qq邮箱的服务器地址赋值到变量mailhost上,地址需要是字符串的格式。
qqmail = smtplib.SMTP()
#实例化一个smtplib模块里的SMTP类的对象,这样就可以SMTP对象的方法和属性了
qqmail.connect(mailhost,25)
#连接服务器,第一个参数是服务器地址,第二个参数是SMTP端口号
**mailhost=‘smtp.qq.com'**这句是qq邮箱的服务器地址,这个是可以查得到的
用SMTP对象的connect()方法连接服务器,第一个参数是获取到的服务器地址,第二个参数是SMTP端口号——25。端口号的选择不是唯一的,但是25是一个最简单、最基础的端口号,所以我们填25。
2.获取账号和密码
此密码非彼密码,这个密码需要我们去到这里获取:https://mail.qq.com/,登录你的邮箱。然后点击位于顶部的【设置】按钮,选择【账户设置】。
下拉到这个位置
点击开启第一个,然后得到授权码,如果以前获取过但是忘了,就需要发送短信重新获取,这个码一定不要外漏!!!
import smtplib
mailhost='smtp.qq.com'
#把qq邮箱的服务器地址赋值到变量mailhost上
qqmail = smtplib.SMTP()
#实例化一个smtplib模块里的SMTP类的对象,这样就可以SMTP对象的方法和属性了
qqmail.connect(mailhost,25)
#连接服务器,第一个参数是服务器地址,第二个参数是SMTP端口号。
sender = input('请输入你的邮箱:')
#获取邮箱账号
password = input('请输入你的密码:')
#获取邮箱密码
qqmail.login(sender,password)
#登录邮箱,第一个参数为邮箱账号,第二个参数为邮箱密码
receiver=input('请输入收件人的邮箱:')
#获取收件人的邮箱
所填密码就是刚才获取的授权码
3.填写主题和撰写正文
在这里就需要用到email库。
from email.mime.text import MIMEText
from email.header import Header
content=input('请输入邮件正文:')
#输入你的邮件正文
message = MIMEText(content, 'plain', 'utf-8')
#实例化一个MIMEText邮件对象,该对象需要写进三个参数,分别是邮件正文,文本格式和编码
subject = input('请输入你的邮件主题:')
#用input()获取邮件主题
message['Subject'] = Header(subject, 'utf-8')
我们还需要引入了email库中的MIMEText模块和Header模块
最后一行代码:在等号的右边,是实例化了一个Header邮件头对象,该对象需要写入两个参数,分别是邮件主题和编码,然后赋值给等号左边的变量message[‘Subject'],message[‘Subject']就代表着根据MIMEText类里面的Subject的属性名取到该属性
代码有注释还不明白的话可以去看看文档,
4.发送邮件和退出邮箱
将前面的代码整合以下
from email.mime.text import MIMEText
from email.header import Header
#引入Header和MIMEText模块
content=input('请输入邮件正文:')
#输入你的邮件正文
message = MIMEText(content, 'plain', 'utf-8')
#实例化一个MIMEText邮件对象,该对象需要写进三个参数,分别是邮件正文,文本格式和编码
subject = input('请输入你的邮件主题:')
#用input()获取邮件主题
message['Subject'] = Header(subject, 'utf-8')
qqmail.sendmail(sender, receiver, message.as_string())
qqmail.quit()
#退出邮箱
sendmail() 发送邮件,括号里面有三个参数,第1个是发件人的邮箱地址,第2个是收件人的邮箱地址,第3个是正文,但必须是字符串格式,所以用as_string()函数转换了一下。
但是我们希望发送成功后能显示“邮件发送成功”,失败的时候能提示我们“邮件发送失败”,可以使用try语句来实现。
try:
qqmail.sendmail(sender, receiver, message.as_string())
print ('邮件发送成功')
except:
print ('邮件发送失败')
qqmail.quit()
三.定时发送
关于时间,其实Python有两个内置的标准库——time和datetime,但是我们不用,诶,就是玩,我们可以用第三方库schedule其实是有原因的:对于我们需要的定时功能,time和datetime当然能实现,但操作逻辑会相对复杂;而schedule就是可以直接解决定时功能,代码比较简单,这是我们选择schedule的原因。
官方文档链接:https://pypi.org/project/schedule/
根据文档我们做一个每3秒运行一次的程序
import schedule
import time
#引入schedule和time模块
def job():
print("Working in progress...")
#定义一个叫job的函数,函数的功能是打印'I'm working...'
schedule.every(3).seconds.do(job)
while True:
schedule.run_pending()
time.sleep(1)
也可以设置在某个时间发送,用法很多,这里就不展开。最后把这些代码全部合并整合一下,下面看效果
四.效果
这里我定的下午三点四十六,然后发送成功,我打开我的邮箱确实能收到
这个功能我放在服务器上用了很久了,爬一些平时自己必看的信息,然后发送,减少了自己被其他东西吸引注意力的几率。
这篇文章不在于爬取天气信息这块,而是通过这种方式去实现定时发送邮件,只要用的好能为自己省下很多的时间和精力去在信息大海里面查找自己想要的信息。
来源:https://blog.csdn.net/m0_53088614/article/details/121247320
猜你喜欢
- jxdawei的个人博客:http://www.iwcn.net本文目的:与您分享如何学习基于web标准的网页制作。适合人群:网页制作初学者
- 突然有个想法,不知道是不是首创:用"表情符号"做植入广告. 目前的表情符号 "黄色小圆脸"系列可以说
- python 实现删除文件或文件夹  
- 本文实例讲述了Python装饰器用法。分享给大家供大家参考,具体如下:一、装饰器是什么python的装饰器本质上是一个Python函数,它可
- HTML文档是互联网上的主要文档类型,但还存在如TXT、WORD、Excel、PDF、csv等多种类型的文档。网络爬虫不仅需要能够抓取HTM
- 分享两个常用的代码生成工具:gormgenhandlergengormgen基于 MySQL 数据表结构进行生成 3 个文件:生成表的 st
- open 遍历一个大日志文件使用 readlines() 还是 readline() ?总体上 readlines() 不慢于python
- Python 想必大家都已经很熟悉了,甚至关于它有用或者无用的论点大家可能也已经看腻了。但是无论如何,它作为一个广受关注的语言还是有它独到之
- 使用在Safari和WebKit中可用的CSS高级特性,你可以为你的网站和网络应用带来一个新的级别的令人兴奋的东西。WebKit是Safar
- 一直以来,jQuery是我最喜欢的框架之一。1月14号 1.4 Released版本发布后,就迫不及待去了解了一下1.4版本对比以往1.3.
- 由于Django没有象rails一样指定项目的目录结构规范,很多人都对django项目的目录结构要如何组织而感到困惑。为此我又新创建了一个开
- PHP使用缓存即时输出内容(output buffering)的方法。分享给大家供大家参考。具体如下:$buffer = ini_get(&
- 前段时间我通过观察韩国网站和其他作品发现了普遍存在黄金分割这样一个规律,不过只跟色相有关,明度、纯度还没做研究,今天看到论坛一篇“网页配色之
- 1)用这个方法,把虚拟主机的默认页只设置成一个比如index.asp 在index.asp的最上面加入以下代码:<%if R
- 两种方法实现:1、在双引号前面加个转义符 \ ,即反斜杠。如"Hello \"W \"orld",会
- 我在前几天的博客中翻译了一篇《20个对学习CSS3大有裨益的资源》的文章,其中推荐了Get started with CSS 3,本文为其中
- 一. Python中表示时间的两种方式:时间戳:相对于1970.1.1 00:00:00以秒计算的偏移量,唯一的时间元组struct_tim
- 本文实例讲述了python 正则表达式贪婪模式与非贪婪模式原理、用法。分享给大家供大家参考,具体如下:之前未接触过正则表达式,今日看pyth
- 我们平日办公时用得最多的软件是Execl、Word或WPS Office等,你的计算机中一定储存着大量的XLS、DOC、WPS文件吧!网页制
- 所谓产品其实最终展现在用户面前的只是界面而已,所谓界面绝大多数时候只包括两个部分:图片、文字。重视界面上的每一个像素和每一个文字是UED的基