python+beautifulsoup+smtp爬取学院网站的信息公告+邮件发送

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011964923/article/details/53714250

最近学习了利用python爬虫,甚是有趣。所以写了个试用的小程序分享出来。

学院的相关通知都会放在网站的信息公告上,但每天打开电脑->打开浏览器->打开学院网站,就为了看个信息公告,挺麻烦还容易忘记。但害怕错过重要通知,又不得不看。


所以,我就想,能不能让我的云服务器自动爬取学院网站的信息公告,把信息公告做HTML格式的e-mail,然后每天早上9点钟定时自动给我发一封邮件呢。在这封邮件里面,我可以看到最近发布的通知,点击通知能够直接链接到通知详情页面。


说干就干,代码其实也就几十行而已。


首先介绍下代码中用到的一些python库:

from bs4 import BeautifulSoup
import requests
import codecs
import smtplib
from email.mime.text import MIMEText
import time

其中,BeautifulSoup是爬虫库,用来解析HTML网页;requests库用于向学校网站发送请求,GET下来网页;codecs是个编码库,可以用'utf-8'编码格式打开文件;stmplib是发送邮件用的;time用于定时。

【步骤1】锁定信息公告在HTML的位置

扫描二维码关注公众号,回复: 3508931 查看本文章
class GrabNews():
    def __init__(self):
        self.NewsList = []
    def getNews(self):
        url = 'http://eis.whu.edu.cn/index.shtml'
        r = requests.get(url)
        soup = BeautifulSoup(r.text, "html.parser")
        newsTitle = soup.find(text="信息公开")
        newsList = newsTitle.parent.next_sibling.next_sibling.find_all('a')
        for news in newsList:
            for string in news.stripped_strings:
                newsUrl = 'http://eis.whu.edu.cn/' + news['href']
                self.NewsList.append({string:newsUrl})

首先,我们要在浏览器中打开学院含有信息公告的网页,按F12去看信息公告到底在HTML文件的什么位置。 通过Beautifulsoup可以很轻松定位到信息公告。

【步骤2】拿到通知的标题和链接,写入HTML本地文件中

def getNews():
    grabNews = GrabNews()
    grabNews.getNews()
    fp = codecs.open('news.html', 'w', 'utf-8')
    for news in grabNews.NewsList:
        for key in news.keys(): # key:value. key是新闻标题,value是新闻链接
            #fp.write(key+'\n')
            #fp.write(news[key]+'\n')
            fp.write('<a href=%s>%s</a>' % (news[key], '*'+key))
            fp.write('<hr />')
    fp.close()
这里面实例化了一个GrabNews类,从这个类中可以获取通知的标题和链接,存放在“news.html”中。每个通知做成链接形式,用水平线<hr />隔开。

【3】发送HTML格式的邮件

def sendNews():
    # 第三方 SMTP 服务
    mail_host = 'smtp.sina.com'  # SMTP服务器
    mail_user = '[email protected]'  # 用户名
    mail_pass = 'your_password'

    # 收发方地址
    sender = '[email protected]'  # 发件人邮箱
    receivers = ['[email protected]']  # 接收邮件

    # 从HTML文件中读取发送邮件的内容
    fp = open('news.html')
    message = MIMEText(fp.read(), 'html', 'utf-8')  #内容, 格式, 编码
    fp.close()

    # 补全消息头部信息
    message['Subject'] = '电信院信息公告'
    message['From'] = "{}".format(sender)
    message['To'] = ",".join(receivers)

    try:
        smtpObj = smtplib.SMTP(mail_host, 25)  # SMTP协议默认端口是25
        smtpObj.login(mail_user, mail_pass)  # 登录验证
        smtpObj.sendmail(sender, receivers, message.as_string())  # 发送
        print('mail has been send successfully.')
    except smtplib.SMTPException as e:
        print(e)	
我这里是通过SMTP协议,从我的新浪邮箱,发送到我的qq邮箱。 注意需要先登录,再发送,消息头部信息‘Subject', 'From', 'To'不要忘记。 这里需要注意的是,如果你填写的邮箱用户名和密码都是正确的,但发现登录失败。 那么最大的可能,就是你的邮箱为开通SMTP服务,这是后你可以通过浏览器登录邮箱,在“设置”中开启SMTP服务,这时候你会得到一个授权码。再返回代码中,将邮箱密码替换为授权码即可成功登录。

【4】程序入口,定时发送

if __name__ == '__main__':
    while(True):
        if('09:00'==time.strftime('%H:%M')):
            getNews()
            sendNews()
            time.sleep(61)  # 等待一分钟以上
        else:
            time.sleep(30)  # 每30秒查询一次系统时间
通过time.strftime获取当前系统时间,每天早上’09:00“准时发送邮件。 这里time.sleep(61)如果去掉的话,你在这一分钟内就会不停地收到同一封邮件。哈哈


上个图:




猜你喜欢

转载自blog.csdn.net/u011964923/article/details/53714250