很多时候我们是用爬虫可以来方便获取网站上的信息,对于程序员可以很简单的运行爬虫程序,但是对于不会编程的人来说就比较困难,甚至无法搭建运行环境,解决方案就是把爬虫程序生成一个可以移动的软件,下面是个小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的文件,这就说明打包完成,双击打开就可以运行程序