python每天定时爬取学校官网通知,并把通知发送到邮箱

项目背景:因为有时候要关注一些官网上的通知,比如政府网站、学校网站等等,这些通知往往具有时效性,而我们也不能保证每天都能去上网看,所以使用python做了这个小任务,每天定时爬取学校官网的通知,并发送到邮箱。
这个小任务主要包括三部分:

  1. 数据爬取
  2. 邮件发送
  3. 定时执行

1、数据爬取

python每天定时爬取学校官网通知,并把通知发送到邮箱_第1张图片
这里我使用requests+beautifulsoup来进行数据抓取。
首先抓取文章列表页的url,返回一个list:

def get_url():
    url = 'http://www.bzuu.edu.cn/jxjy/125/list.htm'
    r = requests.get(url=url)
    soup = BeautifulSoup(r.text, 'lxml')
    links = soup.find_all('td', width="97%")
    main_url = 'http://www.bzuu.edu.cn'
    url_list = []
    for link in links:
        a = link.a['href']
        if a.endswith('htm'):
            url_list.append(main_url+a)
    return url_list

接着获取文章发布时间和标题:
python每天定时爬取学校官网通知,并把通知发送到邮箱_第2张图片

def get_content():
    title_list = []
    for url in get_url():
        r = requests.get(url=url)
        r.encoding = 'utf-8'
        soup = BeautifulSoup(r.text, 'lxml')
        title = soup.find('span', class_="Article_Title").text
        pub_data = soup.find('span', class_="Article_PublishDate").text
        current_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
        if pub_data == current_time:
            title_list.append(pub_data + " ; 今日公告:" + title + ";" + "详情点击: " + url)
    if len(title_list) == 0:
        sent_email(mail_body='今天没有通知')
    else:
        for title in title_list:
            sent_email(mail_body=title)
    title_list.clear()

这里有几个需要注意的点,就是关于中文乱码问题,通过request获取到的网页信息,部分中文会出现乱码情况,为此需要做一次操作:

r.encoding = 'utf-8'

2、邮件发送

这里需要用到几个库:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

具体代码:

def sent_email(mail_body):
    sender = '***********'
    receiver = '**********'
    smtpServer = 'smtp.163.com'
    username = '*******'
    password = '*******'
    mail_title = '今日通知'
    mail_body = mail_body

    message = MIMEText(mail_body, 'plain', 'utf-8')
    message["Accept-Language"] = "zh-CN"
    message["Accept-Charset"] = "ISO-8859-1,utf-8"
    message['From'] = sender
    message['To'] = receiver
    message['Subject'] = Header(mail_title, 'utf-8')

    try:
        smtp = smtplib.SMTP()
        smtp.connect(smtpServer)
        smtp.login(username, password)
        smtp.sendmail(sender, receiver, message.as_string())
        print('邮件发送成功')
        smtp.quit()
    except smtplib.SMTPException:
        print("邮件发送失败!!!")

其中包括sender发送方,receiver接收方,需要特别注意的是,username是你的邮箱账号,但password不是你的邮箱密码,而是你的smtp授权密码,如果发送的正文当中出现乱码情况,需要做一步操作:

    message["Accept-Language"] = "zh-CN"
    message["Accept-Charset"] = "ISO-8859-1,utf-8"

3、定时执行

这里需要用到windows的计划任务功能:
python每天定时爬取学校官网通知,并把通知发送到邮箱_第3张图片
python每天定时爬取学校官网通知,并把通知发送到邮箱_第4张图片
接下来几步操作没什么可说的,最重要的一步是:
python每天定时爬取学校官网通知,并把通知发送到邮箱_第5张图片
第一个输入框输入:python.exe
添加参数输入脚本的完整路径
起始于输入python.exe的解释器路径;
需要注意的一点是:要看清设置选项,有的设置选项是必须插入电源才能按时执行,这个要勾选掉,否则可能会出现执行不成功的情况。

你可能感兴趣的:(爬虫)