今天说一下如何用python给你女朋友发天气预报和情话,让她明白程序员也有浪漫
整体思路:
- 上网爬取天气信息
- 上网爬取情话
- 发邮件
- 实现定时发邮件
需要用到的模块:
- requests:用于向网站发送请求
- yagmail:用法发邮件
- schedule:用于实现定时任务
- BeautifulSoup:处理网页标签
- re:正则过滤
天气获取的url:https://tianqi.2345.com/。这个是默认的,为了省去一写麻烦我直接在首页点到对应的城市,最终链接如下:https://tianqi.2345.com/cixian1d/70177.htm,你们可以改成你们女朋友城市的链接。
我获取情话的url地址是:https://www.guaze.com/juzi/23389.html。当然,你们也可以自定义一些情话使用random随机发送
首先我们需要导入对应的模块:
先做第一步,上网爬取天气信息
import requests
from bs4 import BeautifulSoup
url = 'https://tianqi.2345.com/cixian1d/70177.htm'
经过分析我们找到了我们要取的标签内容所在位置
接下来我们开始爬取:
web = requests.get(url) # 对网页进行get请求
# print(web.text)
page = BeautifulSoup(web.text,'html.parser') # 将get下来的网页内容交给BeautifulSoup处理,并指定解释器为html
weather = page.find('div',class_='real-today') # 搜索我们要获取的span标签内容上面的div标签,指定它的class name为real-today。这个可以在上图看到div后面有class,后面引号内的内容就是它的class name
print(weather.text)
执行结果如下:
今天:24-31° 阵雨转阴
到这第一步爬取天气就完成了,是不是很简单.
接下来我们开始第二部,爬取情话
此步还需再导入一个re模块
import re
loveurl = 'https://www.guaze.com/juzi/23389.html'
web2 = requests.get(loveurl)
web2.encoding='gb2312' # 此处需要对网站指定一个编码格式
# print(web2.text)
page = BeautifulSoup(web2.text, "html.parser")
div = page.find('div', class_="content")
print(div.text)
# 和上面套路相同
执行结果如下:(太多,所以只展示了部分)
1、人总是贪婪的,就像最开始我只想知道你的名字。
2、海上月是天上月,眼前人是心上人。——张爱玲
3、你知道我的缺点是什么吗?是缺点你
4、我昨天晚上梦到你了,梦里面我很爱你,对于我来说,梦是虚假的,但爱你是真的。
5、想做那个只喜欢你,也只被你喜欢的人
6、这么多的路,到底哪一条才能到你心里
7、遇见你我变得很低很低,一直低到尘埃里去.但我的心是欢喜的,在那里开出一朵花来。——张爱玲
可以看到跟明显的缺陷,就是有空行,所以我们需要稍加处理
div = str(div.text) # 转换上面获取到的内容格式为字符串
grep = re.compile(r"\d+、(.*)") # re过滤格式为 数字、任意内容,将空行排除
content = grep.findall(div) # 指定要过滤的内容为div,并返回个列表
print(content[1]) # 打印列表内下标为1的内容
结果如下:
海上月是天上月,眼前人是心上人。——张爱玲
到这第二步也完成了,剩下就剩下定时发邮件了
导入模块:
import yagmail # 此模块用于发邮件
import schedule # 此模块用于计划任务
yag = yagmail.SMTP(
host='smtp.qq.com', user='你的邮箱', # 如过用的是qq邮箱就写smtp.qq.com,如果是163就写smtp.163.com
password='授权码', smtp_ssl=True # 授权码在qq邮箱里开启smtp就会生成一个
)
weather = [weather.text,"每日情话:",content[ran], # 定义发送内容
yagmail.inline(r"./love.jpg") # 附件图片,不发图片可以删掉
]
yag.send(
to=['要发送到的邮箱地址'],
subject='天气预报', # 邮件主题
contents=weather # 发送的内容为上面定义的weather,其中weather.text是天气预报,content[ran]是情话
)
完整代码:
import requests
import yagmail # 此模块用于发邮件
import schedule # 此模块用于计划任务
from bs4 import BeautifulSoup
import re
ran = 0
url = 'https://tianqi.2345.com/cixian1d/70177.htm' # 定义天气预报的url
loveurl = 'https://www.guaze.com/juzi/23389.html' # 定义情话的url
def email():
global ran # 将ran变量声明为全局变量
web = requests.get(url)
# print(web.text)
page = BeautifulSoup(web.text,"html.parser")
# print(ran)
# print(love[ran])
weather = page.find("div",class_="real-today")
# print(weather.text)
web2 = requests.get(loveurl)
web2.encoding = 'gb2312'
page = BeautifulSoup(web2.text, "html.parser")
div = page.find('div', class_="content")
div = str(div.text)
# print(div)
grep = re.compile(r"\d+、(.*)")
content = grep.findall(div)
# print(content)
# email函数内的内容是爬取天气和情话的,具体的地址天气你可以更换url
yag = yagmail.SMTP(
host='smtp.qq.com', user='你的邮箱', # 如过用的是qq邮箱就写smtp.qq.com,如果是163就写smtp.163.com
password='授权码', smtp_ssl=True # 授权码在qq邮箱里开启smtp就会生成一个
)
weather = [weather.text,"每日情话:",content[ran], # 定义发送内容
yagmail.inline(r"./love.jpg") # 附件图片,不发图片可以删掉
]
yag.send(
to=['要发送到的邮箱地址'],
subject='天气预报', # 邮件主题
contents=weather # 发送的内容为上面定义的weather,其中weather.text是天气预报,content[ran]是情话
)
print("发送完成")
ran += 1
schedule.every().day.at("05:21").do(email) # 每天5点21分执行函数email0
# schedule.every(10).seconds.do(email) #每10秒执行一下函数email的内容,我这里用于测试
while True:
schedule.run_pending()
其中ran变量用于取情话列表内的内容,每发一次加1,以此来让每次发的情话都不一样
效果如下:(我这里设置的是每天凌晨5:21发送,你可以根据需求改,图片也是)快给你女朋友安利起来吧!