Python中如何使用PyQt5编写监控小说最新章节的工具
Python中如何使用PyQt5编写监控小说最新章节的工具
很棒,给 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 我觉得就可以上手了
我做了个差不多的,不过我是监控微博和公众号的,有更新就把内容发到我邮箱
谢谢!
666
追书神器不就是这么起家的吗?
赞
谢谢!
楼主的想法我也做过,而且进一步做了章节抓取,给你参考一下:
https://github.com/winglight/soducrawler
——之前还有好多想法,结果懒癌发作。。。
star
我可以做 但我不想做~~
我大学时候做了这个 更正式: https://github.com/howie6879/owllook (滑稽笑)




