Python爬虫学习:定时爬取学校通知

目的

  • 爬取学校通知,并将内容每天定时发送到邮箱。

思路

  1. 爬取学校通知
  2. 将通知储存进数据库
  3. 读取数据库中的通知
  4. 发送邮件

方法

  1. 爬取学校教务部通知

需要导入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]
  1. 将爬取的通知存入数据库

这里使用的数据库是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()
  1. 读取数据库中的内容,获取最近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()
  1. 发送通知到邮箱

首先需要打开邮箱的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()
  1. 设置定时发送

这里使用的是Python轻量级定时任务调度的库:schedule。

import schedule
# 每天早上7:30发送最近5天的通知到邮箱
schedule.every().day.at("07:30").do(getFiveDaysNews)

可以将项目挂载在云服务器上,让它持续运行。

最后

  • 内容仅供大家学习参考,若有不足之处,敬请大家批评指正!
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值