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的文件,這就說明打包完成,雙擊打開就可以運行程序

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