使用 Python 爬取研究生官网最新公告通知并推送微信消息

效果

原理很简单,我只需要使用BeautifulSoup库每隔一段时间爬取一下官网网页的内容,然后把通知有关的信息存入一个数据库判断是不是新的通知就可以。如果是新的通知就使用虾推啥推送微信消息。效果如下:

为了代码一直运行,所以我将它直接扔到服务器。让它一直跑着就行了。

代码

这里需要用到虾推啥,一行代码推送手机通知。
虾推啥官网教程链接

整体代码都比较简单易懂,小白也可以使用。
Python代码:

python 复制代码
import pymysql
import requests
from bs4 import BeautifulSoup
import time
# 数据库信息自己填写
db_config = {
    'host': '***',
    'user': '**',
    'passwd': '***',
    'port': 3306,
    'db': '***',
    'charset': 'utf8'
}
db = pymysql.connect(**db_config)


def get_html(url):
    r = requests.get(url)
    r.encoding = "utf-8"
    if r.status_code != 200:
        raise Exception()
    return r.text


def parse_html(html_doc, element, class_name):
    soup = BeautifulSoup(html_doc, "html.parser")
    dev_nodes = soup.find_all(element, class_=class_name)
    return dev_nodes


def insert_into_db(title, url, date):
    cursor = db.cursor()
    sql = "SELECT * FROM notice WHERE title = %s"
    cursor.execute(sql, (title,))
    if not cursor.fetchone():
        sql = "INSERT INTO notice(title, content, date) VALUES (%s, %s, %s)"
        try:
            cursor.execute(sql, (title, url, date))
            db.commit()
        except:
            db.rollback()
            print("插入失败")


def is_new(title):
    cursor = db.cursor()
    sql = "SELECT * FROM notice WHERE title = %s"
    cursor.execute(sql, (title,))
    if not cursor.fetchone():
        return True
    return False


def send_message(title, url, date, stitute):
    mydata = {
        'text': stitute,
        'desp': '内容:' + title + '<br>' \
                                  '网址:' + '<a href="' + url + '">' + url + '</a>' + '<br>' \
                                                                                      '日期:' + date
    }
    requests.post('https://wx.xtuis.cn/您的token.send', data=mydata)
    # 注意这里要换成你自己的token

def CIE():
    url = "https://*****" # 这里要根据自己学校的官网填写,并且网页布局也不一样,获取元素逻辑不一样
    bs_url = "https://****"
    html_doc = get_html(url)
    dev_nodes = parse_html(html_doc, "li", "first")
    title = dev_nodes[0].find("a").get_text().strip()
    date = dev_nodes[0].find("span").get_text()
    to_url = bs_url + dev_nodes[0].find("a")["href"]
    # 上面几行都是获取页面元素的逻辑,要根据实际情况修改。
    if is_new(title):
        print("信息工程学院官网有新公告!")
        insert_into_db(title, to_url, date)
        send_message(title, to_url, date, "信息工程学院官网有新公告!")
    else:
        print("无新公告!")


def GraduateSchool():
    url = "https://****" # 同上
    bs_url = "https://***"
    html_doc = get_html(url)
    dev_nodes = parse_html(html_doc, "a", "tit")
    title = dev_nodes[0].get_text()
    content = bs_url + dev_nodes[0]['href']
    date = parse_html(html_doc, 'li', "first")[0].get_text()
    if is_new(title):
        print("研究生学院官网有新公告!!")
        insert_into_db(title, content, date)
        send_message(title, content, date, "研究生学院官网有新公告!")
    else:
        print("无新公告!")


while True:
    CIE()
    GraduateSchool()
    print("目前时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    time.sleep(60 * 5)

注意根据自己的实际情况修改代码中自己的参数。

相关推荐
m0_748554816 小时前
golang如何实现用户订阅偏好管理_golang用户订阅偏好管理实现总结
jvm·数据库·python
smj2302_796826527 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
阿正呀8 小时前
Redis怎样实现本地缓存的高效失效通知
jvm·数据库·python
九转成圣8 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
SmartRadio8 小时前
ESP32-S3 双模式切换实现:兼顾手机_路由器连接与WiFi长距离通信
开发语言·网络·智能手机·esp32·长距离wifi
2501_901200538 小时前
mysql如何设置InnoDB引擎参数_优化innodb_buffer_pool
jvm·数据库·python
laowangpython8 小时前
Rust 入门:GitHub 热门内存安全编程语言
开发语言·其他·rust·github
我叫汪枫8 小时前
在后台管理系统中,如何递归和选择保留的思路来过滤菜单
开发语言·javascript·node.js·ecmascript
_.Switch8 小时前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript
软件技术NINI8 小时前
webkit简介及工作流程
开发语言·前端·javascript·udp·ecmascript·webkit·yarn