最近由于好奇买了一本《PyQt5快速开发与实战》,翻阅了两天的书今天想检验一下成果。
我们的目标是做一个小说下载器,先预览一下最终成果的展示图:
整个代码的下载地址
在开始之前我们需要安装好以下的库:
python36
requests
lxml
pymysql
sys
PyQt5的相关库
- 第一步:我们要获取笔趣阁网站的所有小说的URL地址并将其和书名保存进数据库
import requests
from lxml import etree
import pymysql
def spider():
url = "http://www.xbiquge.la/xiaoshuodaquan/"
req = requests.get(url) # 获取响应
html = etree.HTML(req.content.decode("utf8", "ignore"))
lists = html.xpath("//div[@class='novellist']/ul/li")
db = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='biquge', charset='utf8')
cursor = db.cursor()
data = "insert into story_list(story_name,story_url) values(%s, %s)"
for list in lists:
name = "".join(list.xpath("./a/text()"))
url = "".join(list.xpath("./a/@href"))
try:
cursor.execute(data, (name, url))
print("小说:"+name)
db.commit()
except:
db.rollback()
db.close()
if __name__ == '__main__':
spider()
- 第二步:当你有了上述的数据库之后我们就要开始设计GUI界面并设计完成想要的功能
布局设置界面:
super(Quire,self).__init__()
self.setWindowTitle("笔趣阁小说下载器")
self.label =QLabel("请输入小说名:")
self.edit=QLineEdit()
self.quire=QPushButton("查询")
self.down=QPushButton("下载")
self.down.setEnabled(False)
self.shows=QTextEdit()
#定义一个度条
self.progressbar = QProgressBar()
self.progressbar.setMinimum(0)
#定义一个定时器
self.timer = QTimer()
self.progressbar.setMaximum(100)
self.grid = QGridLayout()#设置网格布局
#向网格中添加控件
self.grid.addWidget(self.label, 0, 0, 1, 1)
self.grid.addWidget(self.edit, 0, 1, 1, 1)
self.grid.addWidget(self.quire, 1, 0, 1, 2)
self.grid.addWidget(self.down, 2, 0, 1, 2)
self.grid.addWidget(self.shows, 3, 0, 3, 2)
self.grid.addWidget(self.progressbar, 7, 0, 1, 2)
#连接信号与槽
self.down.clicked.connect(self.start_stop)
self.quire.clicked.connect(self.quir_novel)
self.timer.timeout.connect(self.down_novel)
self.setLayout(self.grid)
查询按钮:负责对文本框控件输入的小说名进行查询看是否存在这个小说:
#若在下载中重新查询则要初始化
self.down.setEnabled(False)
self.down.setText("下载")
self.init()
#设置对话框提示
qbox = QMessageBox()
qbox.setWindowTitle("提示")
qbox.setStandardButtons(QMessageBox.Yes)
button1 = qbox.button(QMessageBox.Yes)
button1.setText('确定')
#根据小说名查询数据库判断
db = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='biquge', charset='utf8')
cursor = db.cursor()
sql = 'select story_url from story_list where story_name ="%s"' % (self.edit.text())
try:
cursor.execute(sql)
result = cursor.fetchall()
self.url = "".join(result[0])
print(self.url)
req = requests.get(self.url)
html = etree.HTML(req.content.decode("utf8", "ignore"))
lists = html.xpath("//div[@id ='list']/dl//dd")
for list in lists:
title_url = "".join(list.xpath("./a/@href"))
#将所有url地址都存放于列表中
self.url_list.append(title_url)
self.name=self.edit.text()
#获取url地址列表的总长度
self.length=len(self.url_list)
self.step=self.length
#将列表反转,方便list.pop()获取正向的页码
self.url_list.reverse()
#创建小说的TXT文件
self.file=open(self.name+".txt", "a", encoding="utf8")
self.down.setEnabled(True)
qbox.setText('查询小说: '+self.name+" 成功")
except:
qbox.setText('请输入正确的小说名字')
self.edit.clear()
qbox.exec_()
db.close()
下载按钮:负责下载小说所有章节的文章内容(这里就要写爬虫了)
url =self.url_list.pop()
#获取已经下载的章节url,并计算跟新进度条
self.length=len(self.url_list)
step=(self.step-self.length)/self.step
#request请求爬取访问文章内容
req = requests.get("http://www.xbiquge.la" + url)
html = etree.HTML(req.content.decode("utf8", "ignore"))
title = html.xpath("//div[@class='bookname']/h1/text()")
title = "".join(title)
lists = html.xpath("//div[@id='content']/text()")
novel = "\n".join(lists).replace(" ", " ")
self.file.write(title)
self.file.write("\n")
self.file.write(novel)
self.file.write("\n")
#用于在界面上动态显示已经下载的章节
self.downlist="章节 "+title+" 下载完成"+'\n'+self.downlist
self.shows.setPlainText(self.downlist)
#设置进度条
self.progressbar.setValue(step * 100)
#当下载完毕时做出的反应
if self.length<=0:
QMessageBox.information(self,"","下载完毕",QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes)
print("小说下载完毕")
self.down.setText('下载')
self.quire.setEnabled(True)
self.timer.stop()
self.file.close()
最后为了更好的交互我们需要进行加载进度条
if self.down.text()=='下载' or self.down.text()=='继续下载':
self.down.setText("暂停")
self.quire.setEnabled(False)
self.timer.start(10)
else:
self.quire.setEnabled(True)
self.down.setText("继续下载")
self.timer.stop()
我们可以在Pycharm 控制台输入以下代码 pyinstaller -F 文件名.py 获取一个exe文件!
运行我们就可以获取我们想要的结果了
欢迎交流学习!如有错误请大方指出,不要吝啬你的喜欢!