Python中如何使用PyQt5编写监控小说最新章节的工具

说明

目的是为了监控喜欢的小说是否有更新,由 PyQt5,有需求的可以使用看看,给点意见

截图

开源

项目地址https://github.com/howie6879/owllook_gui


Python中如何使用PyQt5编写监控小说最新章节的工具

27 回复

很棒,给 star 了。
不过起点客户端本来就有更新提示🤔


要写个监控小说更新的PyQt5工具,核心就是定时抓取网页+对比章节列表。我给你个完整可运行的例子:

import sys
import requests
from bs4 import BeautifulSoup
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import threading
import time

class NovelMonitor(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()
        self.last_chapters = []
        self.timer = QTimer()
        self.timer.timeout.connect(self.check_update)
        
    def init_ui(self):
        self.setWindowTitle('小说更新监控器')
        self.setGeometry(300, 300, 600, 400)
        
        # 布局
        layout = QVBoxLayout()
        
        # 输入区域
        input_layout = QHBoxLayout()
        self.url_input = QLineEdit()
        self.url_input.setPlaceholderText('输入小说目录页URL')
        input_layout.addWidget(QLabel('小说URL:'))
        input_layout.addWidget(self.url_input)
        
        # 控制按钮
        btn_layout = QHBoxLayout()
        self.start_btn = QPushButton('开始监控')
        self.stop_btn = QPushButton('停止监控')
        self.stop_btn.setEnabled(False)
        self.start_btn.clicked.connect(self.start_monitoring)
        self.stop_btn.clicked.connect(self.stop_monitoring)
        btn_layout.addWidget(self.start_btn)
        btn_layout.addWidget(self.stop_btn)
        
        # 章节列表
        self.chapter_list = QListWidget()
        
        # 状态栏
        self.status_label = QLabel('准备就绪')
        
        # 添加到主布局
        layout.addLayout(input_layout)
        layout.addLayout(btn_layout)
        layout.addWidget(QLabel('章节列表:'))
        layout.addWidget(self.chapter_list)
        layout.addWidget(self.status_label)
        
        self.setLayout(layout)
    
    def fetch_chapters(self, url):
        """抓取章节列表"""
        try:
            headers = {'User-Agent': 'Mozilla/5.0'}
            response = requests.get(url, headers=headers, timeout=10)
            response.encoding = 'utf-8'
            soup = BeautifulSoup(response.text, 'html.parser')
            
            # 这里需要根据具体网站结构调整选择器
            chapters = []
            for link in soup.find_all('a'):
                href = link.get('href', '')
                text = link.get_text().strip()
                if '章' in text and href:  # 简单判断章节链接
                    chapters.append(f"{text} - {href}")
            
            return chapters[:20]  # 只显示最新20章
        except Exception as e:
            return []
    
    def check_update(self):
        """检查更新"""
        url = self.url_input.text().strip()
        if not url:
            return
            
        current_chapters = self.fetch_chapters(url)
        
        if not current_chapters:
            self.status_label.setText('获取章节失败')
            return
            
        # 检测新章节
        if self.last_chapters:
            new_chapters = []
            for chap in current_chapters:
                if chap not in self.last_chapters:
                    new_chapters.append(chap)
            
            if new_chapters:
                self.show_notification(f"发现{len(new_chapters)}个新章节!")
                for chap in new_chapters:
                    self.chapter_list.insertItem(0, f"🆕 {chap}")
        
        # 更新章节列表
        self.last_chapters = current_chapters
        self.status_label.setText(f"最后检查: {time.strftime('%H:%M:%S')} | 章节数: {len(current_chapters)}")
    
    def start_monitoring(self):
        """开始监控"""
        url = self.url_input.text().strip()
        if not url:
            QMessageBox.warning(self, '警告', '请输入小说URL')
            return
            
        self.status_label.setText('开始监控...')
        self.start_btn.setEnabled(False)
        self.stop_btn.setEnabled(True)
        
        # 先获取一次章节
        self.last_chapters = self.fetch_chapters(url)
        self.chapter_list.clear()
        for chap in self.last_chapters:
            self.chapter_list.addItem(chap)
        
        # 启动定时器,每5分钟检查一次
        self.timer.start(300000)  # 300000ms = 5分钟
    
    def stop_monitoring(self):
        """停止监控"""
        self.timer.stop()
        self.start_btn.setEnabled(True)
        self.stop_btn.setEnabled(False)
        self.status_label.setText('监控已停止')
    
    def show_notification(self, message):
        """显示通知"""
        QMessageBox.information(self, '发现更新!', message)
        # 也可以添加系统通知
        # from win10toast import ToastNotifier
        # toast = ToastNotifier()
        # toast.show_toast("小说更新", message, duration=5)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    monitor = NovelMonitor()
    monitor.show()
    sys.exit(app.exec_())

这个工具的核心逻辑很简单:定时抓取网页,解析章节链接,对比上次的结果。你需要根据目标网站调整fetch_chapters方法中的解析逻辑,不同网站的HTML结构不一样。运行前记得安装依赖:pip install PyQt5 requests beautifulsoup4

简单说就是定时抓网页比章节。

用的微信读书,更新自动推送。

想做成在后台监控 而且小说不仅起点一家吧?

很棒棒

还有什么。。我都在起点看的

挺多的 磨铁 纵横

好像不支持搜索欢乐书客的书?

可能需要添加源 可以说出书名 我后续看能不能支持

我用的是搜书大师,原理看上去是爬了几十个盗版小说站。有更新推送

我这原理也差不多

简单改改就可以监控新番更新了🤣

Pyqt5 的资料好少啊,楼主有推荐的吗

可以的 哈哈 很有想法 我可以改改

我也是学习 PyQt5 练手的 资料确实少 这个项目算是我看这个的总结吧 我是看看 github 有什么对应的开源项目 然后基本基础的控件网上都有 你应该找得到 看会空间布局 然后找个开源项目再结合 Google 我觉得就可以上手了

我做了个差不多的,不过我是监控微博和公众号的,有更新就把内容发到我邮箱

谢谢!

追书神器不就是这么起家的吗?

谢谢!

楼主的想法我也做过,而且进一步做了章节抓取,给你参考一下:
https://github.com/winglight/soducrawler

——之前还有好多想法,结果懒癌发作。。。

我可以做 但我不想做~~

我大学时候做了这个 更正式: https://github.com/howie6879/owllook (滑稽笑)

回到顶部