PyQt5 + 爬虫实现'搜索软件' 百科助手,GUI与爬虫结合

很多时候我们是用爬虫可以来方便获取网站上的信息,对于程序员可以很简单的运行爬虫程序,但是对于不会编程的人来说就比较困难,甚至无法搭建运行环境,解决方案就是把爬虫程序生成一个可以移动的软件,下面是个小demo。

建立PyQt模板

大致如下:
在这里插入图片描述
保存,然后把.ui文件转换成.py文件进行操作

对py文件操作

# -*- coding: utf-8 -*-

import base64
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow
# 这个是导入爬虫程序
from bai_ke import BaiKe

# 字节转图片
def zi_tu():
	# 这是我事先准备好的字节流图片,因为比较长所以这里截取一部分
    b_tu = b'iVBORw0KGgoAAA...g=='
    tu_b = base64.b64decode(b_tu)
    with open('./tu.png', 'wb+') as fp:
        fp.write(tu_b)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName('MainWindow')
        MainWindow.resize(661, 503)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
		# 窗口图标
        self.setWindowIcon(QIcon('tu.png'))

        # 多行文本框
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(40, 90, 581, 371))
        self.textEdit.setObjectName("textEdit")
        # 提示字符串
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(77, 30, 51, 21))
        self.label.setObjectName("label")
        # 单行文本框,输入
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(140, 30, 301, 23))
        self.lineEdit.setObjectName("lineEdit")
        # 提示内容
        self.lineEdit.setPlaceholderText('请输入要搜索的内容')
        # 清空按钮
        # self.lineEdit.isClearButtonEnabled()

        # 按钮,搜索
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(490, 30, 75, 23))
        self.pushButton.setObjectName("pushButton")


        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 661, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        # 按钮触发的事件
        self.pushButton.clicked.connect(self.button_sou)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        # 窗口标题
        MainWindow.setWindowTitle(_translate("MainWindow", "百科助手"))
        self.label.setText(_translate("MainWindow", "输入内容"))
        self.pushButton.setText(_translate("MainWindow", "搜索"))


    # 按钮事件
    def button_sou(self):
        # 获取文本框内容
        sou_suo = self.lineEdit.text()
        # 判断是否输入内容
        if sou_suo != '':
            # print(sou_suo)
            # 这个是另一个文件里面的类,爬虫程序
            bai_ke = BaiKe()
            ccc = bai_ke.run(sou_suo)
            # print(ccc)
            # 把爬虫的结果展示在textEdit上,因为爬去的是HTML,所以使用setHTML,还有转码
            self.textEdit.setHtml(ccc.decode('utf-8'))

# 继承至界面主窗口类
class MyMainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyMainWindow, self).__init__(parent)
        self.setupUi(self)

if __name__ == '__main__':
    # 图片标题
    zi_tu()
    # 初始化
    app = QApplication(sys.argv)
    myWin = MyMainWindow()
    myWin.show()
    sys.exit(app.exec_())

爬虫程序

import requests
import lxml.html
from lxml import etree

class BaiKe():
    def __init__(self):
    	# 请求头
        self.headers = {
            'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 63.0.3239.132Safari / 537.36Name'
        }
        self.url = 'https://baike.baidu.com/item/'

    def down_html(self,name):
    	# 拼接搜索的url
        url_0 = self.url + name
        res = requests.get(url_0,headers=self.headers).content
        # with open('baike.html','wb+') as fp:
        #     fp.write(res)
        return res
	# 解析抓取的页面
    def tree_html(self,html):
        tree = lxml.html.fromstring(html)
        # 抓取需要的HTML
        result0 = tree.xpath('//div[@class="main-content"]')
        # print(result)
        # 判断是否抓取到内容,因为你要搜索的内容,百科不一定有
        if result0 != []:
            return etree.tostring(result0[0],method='html')
        else:
        	# 这就说明你搜索的内容百科没有,这个要进行编码,因为上面return的是HTML
            return '暂未收录到百科呦!!!'.encode('utf-8')

    def run(self,name):
        html = self.down_html(name)
        # 解析页面
        result = self.tree_html(html)
        return result
        # print(result)
        # with open('ccc.html','wb+') as fp:
        #     fp.write(result)

if __name__ == '__main__':
    baike = BaiKe()
    baike.run('马云')

运行程序测试

在这里插入图片描述
在这里插入图片描述

打包程序

打包程序需要下载pyinstaller

pip install pyinstaller

如果上面pip安装出错,可以到官网下载安装包,进行安装,
打包命令

# 后面两个是文件名
pyinstaller -F -w 百科搜索.py bai_ke.py

打包成功的截图
在这里插入图片描述
在当前目录会生成四个文件
在这里插入图片描述

打开dist文件夹,会看到一个后缀是.exe的文件,这就说明打包完成,双击打开就可以运行程序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章