目的
- 爬取学校通知,并将内容每天定时发送到邮箱。
思路
- 爬取学校通知
- 将通知储存进数据库
- 读取数据库中的通知
- 发送邮件
方法
- 爬取学校教务部通知
需要导入requests模块和bs4模块的BeautifulSoup类。
import requests
from bs4 import BeautifulSoup
# 解析教务部网址内容
url = 'http://jwb.bnu.edu.cn/tag/%E9%80%9A%E7%9F%A5%E5%85%AC%E5%91%8A'
page_text = requests.get(url).text
soup = BeautifulSoup(page_text, 'lxml')
# 获取通知列表
list = soup.find('ul', style='min-eight:400px;').find_all('li')
newslist = []
for news in list:
con = news.text.split('\n')
content = content[1].split('】')[1] # 通知内容
time = content[2] # 通知发布时间
newslist.append([con, time])
由于通知发布的时间有点混乱,采用冒泡排序法来进行排序。
# 冒泡排序
def bubbleSort(arr):
for i in range(len(arr)):
for j in range(0, len(arr) - i - 1):
# 升序排序
if arr[j][1] > arr[j + 1][1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
- 将爬取的通知存入数据库
这里使用的数据库是Python SQLITE数据库,需要导入sqlite3模块。
import sqlite3
# 连接数据库,返回连接对象
conn = sqlite3.connect('NEWS.db')
# 创建教务部通知表,并添加ID、HEADLINE、TIME字段
conn.execute("""create table if not exists JWB_NEWS (
ID integer primary key autoincrement,
HEADLINE text,
TIME text)""")
# 创建游标cursor
cursor = conn.cursor()
# 插入数据
for news in newslist:
# 查询数据是否存在
cursor.execute("select * from JWB_NEWS where HEADLINE='" + news[0] + "'")
# 若数据不存在则插入数据
if len(cursor.fetchall()) == 0:
# 插入一条数据
conn.execute("insert into JWB_NEWS (HEADLINE,TIME) values (?,?)", (news[0], news[1]))
# 数据提交
conn.commit()
# 关闭游标和数据库
cursor.close()
conn.close()
- 读取数据库中的内容,获取最近5天的通知
需要导入sqlite3和datetime模块。
import sqlite3
import datetime
# 获取5天前日期
past = (datetime.datetime.now() - datetime.timedelta(days=5)).strftime("%Y-%m-%d")
# 连接数据库,返回连接对象
conn = sqlite3.connect('NEWS.db')
# 创建游标cursor
cursor = conn.cursor()
# 查询并获取最近5天的教务部通知
jwbnews = []
cursor.execute("select * from JWB_NEWS where TIME>'" + past + "'" + 'order by ID desc')
for row in cursor.fetchall():
jwbnews.append(row[1])
# 关闭游标和数据库
cursor.close()
conn.close()
- 发送通知到邮箱
首先需要打开邮箱的SMTP服务,本人使用的是QQ邮箱,过程如下:
需要导入smtplib模块和email.mime.text模块的MIMEText类。
import smtplib
from email.mime.text import MIMEText
# 账户信息
sender = '×××××××××@qq.com' # 发件人邮箱
passward = '××××××××××××××××' # 邮箱授权码
user = '×××××××××@qq.com' # 收件人邮箱
# 邮件信息
msg = MIMEText(content, 'plain', 'utf-8') # 邮件内容,文本类型为plain,编码为utf-8
msg['From'] = sender # 发件方
msg['To'] = user # 收件方
msg['Subject'] = "每日通知" # 标题
# 登陆邮箱
server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发送域名,端口465
server.login(sender, passward)
# 发送邮件
server.sendmail(sender, [user], msg.as_string())
# 关闭连接
server.quit()
- 设置定时发送
这里使用的是Python轻量级定时任务调度的库:schedule。
import schedule
# 每天早上7:30发送最近5天的通知到邮箱
schedule.every().day.at("07:30").do(getFiveDaysNews)
可以将项目挂载在云服务器上,让它持续运行。
最后
- 内容仅供大家学习参考,若有不足之处,敬请大家批评指正!