【PyQt5与Requests爬虫】设计图形界面(GUI)实现小说下载器->进度条显示

最近由于好奇买了一本《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("&nbsp", " ")
        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文件!
运行我们就可以获取我们想要的结果了

在这里插入图片描述

欢迎交流学习!如有错误请大方指出,不要吝啬你的喜欢!

> 注意:第一步和第二步要在两个不同的.py文件执行

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值