很多時候我們是用爬蟲可以來方便獲取網站上的信息,對於程序員可以很簡單的運行爬蟲程序,但是對於不會編程的人來說就比較困難,甚至無法搭建運行環境,解決方案就是把爬蟲程序生成一個可以移動的軟件,下面是個小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的文件,這就說明打包完成,雙擊打開就可以運行程序