在一个阳光明媚的午后,我终于闲的蛋疼完成了一个小工具。你是否苦恼于网站小说在线更新却无法及时得知?是否苦于某些up更新了视频却抢不到沙发?你是否需要一个小工具在网页内容有所变动是提醒你?
其实是四月底了还没有复试线信息擦线党很慌想要第一时间获取华师大研招网的最新消息
实现:python3 + qq邮箱 + 其他邮箱 + VPS(可选)
思路
原理上就是一个爬虫爬取网站某一个元素的内容放入文本存储起来,每次爬取时与文本进行比对,如果内容发生变化就使用py自带的smtplib发送邮件,推荐使用QQ邮箱作为收信人,这样QQ和微信可以第一时间收到信息提醒
程序分为两部分,第一个是主程序,用于获取网页内容,第二个为邮件发送程序,满足条件时发送邮件
准备工作
安装库 lxml 与 requests,玩过爬虫的应该都知道这俩吧
import requests
from lxml import etree
from sendemail import email
import os
import time
主程序
写在一个循环中,爬取间隔时间自定
while True:
url = "你要爬取的网址"
content = requests.get(url,verify=False).content.decode('gbk')
#如果网站可信任,可将verify=False去掉,.decode('gbk')用于更正编码错误,我的目标网址使用utf-8解码时是乱码
html = etree.HTML(content)
title = html.xpath("元素所在的Xpath")
# 获取文字
print("当前的标题为:%s" % title.text) #.text取文字
# 屏幕打印获取的文字
如果不清楚怎么寻找目标元素的Xpath,可以参考python+selenium基础之XPATH定位(第一篇)
如果打印出来的结果是,实际上它是一个列表,列表中每一个值都是一个字典
解决参考xpath中遇到“Element a at 0x39a9a80”
if not os.path.isfile("E:\\title_temp.txt"):
#判断title_temp.txt文件是否存在,不存在则创建,并写入获取的第一篇文章标题
f = open("E:\\title_temp.txt", "w") #自己确定一个路径,注意Linux与windows路径区别
f.write(title)
print("将当前标题记录在E:\title_temp.txt中,等待检测")
f.close()
else:
#title_temp.txt文件存在的话,提取里面标题,和获取的标题对比
with open("E:\\title_temp.txt", "r+") as f:
old_title = f.read()
if old_title !=title:
#如果读取内容和获取的网站第一篇文章标题不一致,则表明网站更新
email()#发送qq邮件
f.seek(0)
f.truncate()
print("网站有更新,需通知")
f.write(title)
#写入最新的标题内容,方便下一次比对
break
#退出循环
else:
#否则的话,表明网站没有更新
print("网站暂时没有更新\n")
time.sleep(5)
#检测网页内容时间间隔,单位为秒(s)
邮件发送程序
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def email():
sender = 'xxx@sina.com' #发件人
pwd = 'XXXXXXXXXX' #授权码
receivers = ['123456@qq.com'] #填写收件人
message = MIMEText("你的网站有更新OAO!!","plain",'utf-8')
# 三个参数:第一个为文本内容,第二个为plain设置文本格式,第三个为utf-8设置编码
message ['From'] = "yezi <xxx@sina.com>"
message['To'] = "叶子 <123456@qq.com>"
subject = "你的网站有内容更新"
#邮件主题
message['Subject'] = subject
try:
#使用非本地服务器,需要建立ssl连接
smtpObj = smtplib.SMTP_SSL("smtp.sina.com.cn",465) #新浪的smtp,其他邮箱需要机子查询
smtpObj .login(sender,pwd)
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException as e:
print("Error: 无法发送邮件.Case:%s"%e)
后记
花了一个下午终于搞定了,开开心心准备骑车去超市买点水果结果骑车摔倒了QAQ,车把都歪了 ,写完博客都快晚上8点了,VPS明天再说