pyqt5+python+qtdesigner可视化ui界面爬虫项目实战源码共享

  • A+
所属分类:Python合集

百度贴吧关键词筛选工具源码

pyqt5+python+qtdesigner+pycharm可视化界面爬虫项目实战源码共享

 

如题,这个源码是上次制作的贴吧工具的源码,最近没什么能发的,把源码整理一下发出来供自己复习以及他人学习使用。首先按照之前发的环境配置教程配置好相关环境,然后使用qtcreater制作了界面,手动拖拽制作即可,无需写代码,然后将生成的ui文件转成py文件,建议百度相关教程,我参考的这个教程:简书链接

将.ui的界面文件转换为.py文件

设计完界面后,我们需要把这个.ui变成代码,以方便我们之后的操作。

  • 首先在cmd中打开.ui所在路径cd E:/QT_Creator/bin
  • 然后输入pyuic5 -o mainwindow.py mainwindow.ui回车.其中,-o 后的参数为输出文件的名称 -o 后第二个参数即为生成的ui文件的名称

这样就能得到一个名为mainwindow.py的文件,我们用pycharm打开,就可以对他进行操作了。

这个爬虫制作的ui界面如下:

  1. # -*- coding: utf-8 -*-
  2. # Form implementation generated from reading ui file 'tiebaUI.ui'
  3. #
  4. # Created by: PyQt5 UI code generator 5.11.3
  5. #
  6. # WARNING! All changes made in this file will be lost!
  7. from PyQt5 import QtCore, QtGui, QtWidgets
  8. from PyQt5.QtWidgets import QHeaderView
  9. class Ui_MainWindow(object):
  10. def setupUi(self, MainWindow):
  11.         MainWindow.setObjectName("MainWindow")
  12.         MainWindow.resize(1000, 450)
  13.         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
  14.         sizePolicy.setHorizontalStretch(0)
  15.         sizePolicy.setVerticalStretch(0)
  16.         sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
  17.         MainWindow.setSizePolicy(sizePolicy)
  18.         MainWindow.setMinimumSize(QtCore.QSize(1000, 450))
  19.         MainWindow.setMaximumSize(QtCore.QSize(1000, 450))
  20. self.centralwidget = QtWidgets.QWidget(MainWindow)
  21. self.centralwidget.setObjectName("centralwidget")
  22. self.label = QtWidgets.QLabel(self.centralwidget)
  23. self.label.setGeometry(QtCore.QRect(10, 10, 81, 31))
  24. self.label.setTextFormat(QtCore.Qt.AutoText)
  25. self.label.setAlignment(QtCore.Qt.AlignCenter)
  26. self.label.setObjectName("label")
  27. self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
  28. self.textEdit.setGeometry(QtCore.QRect(90, 10, 150, 31))
  29. self.textEdit.setObjectName("textEdit")
  30. self.label_2 = QtWidgets.QLabel(self.centralwidget)
  31. self.label_2.setGeometry(QtCore.QRect(340, 10, 81, 31))
  32. self.label_2.setTextFormat(QtCore.Qt.AutoText)
  33. self.label_2.setAlignment(QtCore.Qt.AlignCenter)
  34. self.label_2.setObjectName("label_2")
  35. self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)
  36. self.textEdit_2.setGeometry(QtCore.QRect(420, 10, 150, 31))
  37. self.textEdit_2.setObjectName("textEdit_2")
  38. self.label_3 = QtWidgets.QLabel(self.centralwidget)
  39. self.label_3.setGeometry(QtCore.QRect(580, 10, 81, 31))
  40. self.label_3.setTextFormat(QtCore.Qt.AutoText)
  41. self.label_3.setAlignment(QtCore.Qt.AlignCenter)
  42. self.label_3.setObjectName("label_3")
  43. self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
  44. self.textEdit_3.setGeometry(QtCore.QRect(670, 10, 71, 31))
  45. self.textEdit_3.setObjectName("textEdit_3")
  46. self.textEdit_4 = QtWidgets.QTextEdit(self.centralwidget)
  47. self.textEdit_4.setGeometry(QtCore.QRect(860, 10, 71, 31))
  48. self.textEdit_4.setObjectName("textEdit_4")
  49. self.label_4 = QtWidgets.QLabel(self.centralwidget)
  50. self.label_4.setGeometry(QtCore.QRect(770, 10, 81, 31))
  51. self.label_4.setTextFormat(QtCore.Qt.AutoText)
  52. self.label_4.setAlignment(QtCore.Qt.AlignCenter)
  53. self.label_4.setObjectName("label_4")
  54. self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
  55. self.tableWidget.setGeometry(QtCore.QRect(10, 140, 981, 271))
  56.         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
  57.         sizePolicy.setHorizontalStretch(0)
  58.         sizePolicy.setVerticalStretch(0)
  59.         sizePolicy.setHeightForWidth(self.tableWidget.sizePolicy().hasHeightForWidth())
  60. self.tableWidget.setSizePolicy(sizePolicy)
  61. self.tableWidget.setMidLineWidth(1)
  62. self.tableWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
  63. self.tableWidget.setAutoScroll(True)
  64. self.tableWidget.setTabKeyNavigation(True)
  65. self.tableWidget.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerItem)
  66. self.tableWidget.setColumnCount(2)
  67. self.tableWidget.setObjectName("tableWidget")
  68. self.tableWidget.setRowCount(0)
  69. #表格列宽调整方式(自适应)
  70. self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
  71.         item = QtWidgets.QTableWidgetItem()
  72.         item.setTextAlignment(QtCore.Qt.AlignCenter)
  73. self.tableWidget.setHorizontalHeaderItem(0, item)
  74. self.pushButton1 = QtWidgets.QPushButton(self.centralwidget)
  75. self.pushButton1.setGeometry(QtCore.QRect(860, 70, 101, 61))
  76. self.pushButton1.setObjectName("pushButton")
  77. self.pushButton2 = QtWidgets.QPushButton(self.centralwidget)
  78. self.pushButton2.setGeometry(QtCore.QRect(700, 70, 101, 61))
  79. self.pushButton2.setObjectName("pushButton")
  80. self.pushButton3 = QtWidgets.QPushButton(self.centralwidget)
  81. self.pushButton3.setGeometry(QtCore.QRect(250, 10, 40, 31))
  82. self.pushButton3.setObjectName("pushButton")
  83. self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
  84. self.lineEdit.setGeometry(QtCore.QRect(320, 80, 321, 41))
  85. self.lineEdit.setObjectName("lineEdit")
  86. self.label_5 = QtWidgets.QLabel(self.centralwidget)
  87. self.label_5.setGeometry(QtCore.QRect(240, 80, 71, 41))
  88. self.label_5.setObjectName("label_5")
  89. self.label_6 = QtWidgets.QLabel(self.centralwidget)
  90. self.label_6.setGeometry(QtCore.QRect(20, 70, 141, 21))
  91. self.label_6.setObjectName("label_6")
  92. self.label_7 = QtWidgets.QLabel(self.centralwidget)
  93. self.label_7.setGeometry(QtCore.QRect(20, 100, 141, 21))
  94. self.label_7.setObjectName("label_7")
  95.         MainWindow.setCentralWidget(self.centralwidget)
  96. self.menubar = QtWidgets.QMenuBar(MainWindow)
  97. self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 26))
  98. self.menubar.setObjectName("menubar")
  99.         MainWindow.setMenuBar(self.menubar)
  100. self.statusbar = QtWidgets.QStatusBar(MainWindow)
  101. self.statusbar.setObjectName("statusbar")
  102.         MainWindow.setStatusBar(self.statusbar)
  103. self.retranslateUi(MainWindow)
  104.         QtCore.QMetaObject.connectSlotsByName(MainWindow)
  105. def retranslateUi(self, MainWindow):
  106.         _translate = QtCore.QCoreApplication.translate
  107.         MainWindow.setWindowTitle(_translate("MainWindow", "贴吧关键词帖子筛选工具"))
  108. self.label.setText(_translate("MainWindow", "吧名:"))
  109. self.label_2.setText(_translate("MainWindow", "关键字:"))
  110. self.label_3.setText(_translate("MainWindow", "起始页:"))
  111. self.label_4.setText(_translate("MainWindow", "结束页:"))
  112. self.tableWidget.setHorizontalHeaderLabels(['贴名','地址'])
  113. self.pushButton1.setText(_translate("MainWindow", "开始"))
  114. self.pushButton2.setText(_translate("MainWindow", "初始化"))
  115. self.pushButton3.setText(_translate("MainWindow", "导入"))
  116. self.label_5.setText(_translate("MainWindow", "当前状态:"))
  117. self.label_6.setText(_translate("MainWindow", "作者:KONMIN"))
  118. self.label_7.setText(_translate("MainWindow", "版本:v0.0.1"))

如上,是一个类,如果想要显示,加入一个入口函数:

  1. import myUI
  2. from PyQt5.QtWidgets import QApplication, QMainWindow
  3. import sys
  4. if __name__=='__main__':
  5.     app = QApplication(sys.argv)
  6.     MainWindow = QMainWindow()
  7.     ui = myUI.Ui_MainWindow()
  8.     ui.setupUi(MainWindow)
  9.     MainWindow.show()
  10. sys.exit(app.exec_())

单独运行之后就可以显示出制作出来的爬虫界面了,这时候还需要我们的程序逻辑,单独用了一个文件写,这是一个贴吧关键词的爬虫,然后引入了ui界面,对各个按钮控件进行了绑定,所有代码如下:

  1. #!/usr/bin/python
  2. # -*- coding:utf-8 -*-
  3. '''os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
  4. user_agent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"
  5. headers = {'User-Agent': user_agent}
  6. start_urls = 'http://tieba.baidu.com/f/search/res?ie=utf-8'
  7. kw = 'eng'
  8. url = start_urls + kw
  9. request=urllib.request.Request(url,headers=headers)
  10. reponse=urllib.request.urlopen(request).read()
  11. print(reponse)
  12. '''
  13. #!/usr/bin/env python
  14. # -*- coding :gb2312 -*-
  15. import urllib.request
  16. import urllib.parse
  17. import sys
  18. import time
  19. from urllib.request import urlopen
  20. from bs4 import BeautifulSoup
  21. import tiebaUI
  22. from PyQt5.QtWidgets import *
  23. from PyQt5.QtCore import *
  24. class TieBa():
  25. def __init__(self):
  26. super().__init__()
  27. self.initUI()
  28. self.timer = QTimer()
  29. def initUI(self):
  30. self.rowCount = 0
  31. self.ui = tiebaUI.Ui_MainWindow()
  32. self.ui.setupUi(MainWindow)
  33. self.ui.pushButton1.clicked.connect(self.buttonClicked)
  34. self.ui.pushButton2.clicked.connect(self.initUI)
  35. self.ui.pushButton3.clicked.connect(self.getFiles)
  36. self.kw = ""
  37. self.kws = []
  38. self.kw2 = ""
  39. self.beginPage = self.endPage = 0
  40. self.kw_url = "http://tieba.baidu.com/f?"
  41. self.kw2_url = "http://tieba.baidu.com"
  42. self.ui.textEdit.setText('')
  43. self.ui.tableWidget.setRowCount(1)
  44. self.ui.lineEdit.setText('初始化成功...')
  45. def writeAl(self,all_nr_print):
  46. # now = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))
  47. # now = time.strftime("%Y%m%d%H", time.localtime(time.time()))
  48. # fname = (kw + "吧_" + kw2 + now + r".txt")
  49.         fname = (self.kw + "吧_P" + str(self.beginPage) + "-P" + str(self.endPage) + "_" + self.kw2 + r".txt")
  50.         with open(fname, 'a') as f:
  51.             f.write(all_nr_print+"\n")
  52. def all_nr(self,full_url):
  53. # print('all_nr')
  54.         html = urlopen(full_url)
  55.         bsObj = BeautifulSoup(html, 'html.parser')
  56.         t1 = bsObj.find_all('a')
  57. #print(t1)
  58. for t2 in t1:
  59.             t3 = str(t2.get('href'))
  60.             t31 = str(t2.get('title'))
  61. if len(t3) == 13:
  62. if self.kw2 in t31:
  63. #print(t2)
  64.                     all_nr_print = t31 + " " + str(self.kw2_url) + str(t3)
  65.                     url = str(self.kw2_url) + str(t3)
  66. self.ui.tableWidget.setRowCount(self.rowCount + 1)
  67. self.ui.tableWidget.setItem(self.rowCount, 0, QTableWidgetItem(t31))
  68. self.ui.tableWidget.setItem(self.rowCount, 1, QTableWidgetItem(url))
  69. self.rowCount += 1
  70.                     QApplication.processEvents()
  71. #print(all_nr_print)
  72. #self.writeAl(all_nr_print)
  73. self.ui.lineEdit.setText('存入结果...')
  74. def tiebaSpider(self,kw_url, beginPage, endPage,kw):
  75. # 数据存入table
  76. # print('tbSpider')
  77. for page in range(beginPage, endPage + 1):
  78.             pn = (page - 1) * 50
  79.             full_url = kw_url + "&pn=" + str(pn)
  80. #print("\n%s"% full_url)
  81. self.ui.lineEdit.setText('正在抓取+'+ str(kw) + '吧+第'+str(page) + '页...')
  82.             QApplication.processEvents()
  83. self.timer.start(400)
  84. time.sleep(1)
  85. self.all_nr(full_url)
  86. #QApplication.processEvents()
  87. # writeAl(full_url)
  88. self.ui.lineEdit.setText('抓取完成...')
  89. # print('done')
  90. #def tiebaTime(self,tiezi_url):
  91. #获取帖子的发帖时间
  92. def buttonClicked(self):
  93. #print('buttonClicked')
  94. try:
  95. if len(self.kws)== 0:
  96. self.kw = self.ui.textEdit.toPlainText()
  97. self.kws.append(self.kw)
  98. self.kw2 = self.ui.textEdit_2.toPlainText()
  99. self.beginPage = int(self.ui.textEdit_3.toPlainText())
  100. self.endPage = int(self.ui.textEdit_4.toPlainText())
  101. #self.kw2 = '学校'
  102. # self.beginPage = 1
  103. #self.endPage = 4
  104. for i in range(0,len(self.kws)):
  105.                 kw_key = urllib.parse.urlencode({"kw": self.kws[i]})
  106.                 full_url = self.kw_url + kw_key
  107. self.tiebaSpider(full_url, self.beginPage, self.endPage,self.kws[i])
  108.                 QApplication.processEvents()
  109. self.timer.start(400)
  110. time.sleep(1)
  111. #print(self.kw,self.kw2,self.beginPage,self.endPage)
  112. except:
  113. self.ui.lineEdit.setText('发生错误(数据不规范等原因)...')
  114. '''
  115.         kw = input('请输入贴吧名:')
  116.         beginPage = int(input("请输入起始页:"))
  117.         endPage = int(input("请输入结束页:"))
  118.         kw2 = input('请输入帖子主题的\"关键词\":')
  119.         kw_url = "http://tieba.baidu.com/f?"
  120.         kw2_url = "http://tieba.baidu.com"
  121.         kw_key = urllib.parse.urlencode({"kw": kw})
  122.         full_url = kw_url + kw_key
  123.         tiebaSpider(full_url, beginPage, endPage)
  124.         
  125.         '''
  126. #后续添加功能
  127. def getFiles(self):
  128. # 实例化QFileDialog
  129.         dig = QFileDialog()
  130. # 设置可以打开任何文件
  131.         dig.setFileMode(QFileDialog.AnyFile)
  132. # 文件过滤
  133.         dig.setFilter(QDir.Files)
  134. if dig.exec_():
  135. # 接受选中文件的路径,默认为列表
  136.             filenames = dig.selectedFiles()
  137. # 列表中的第一个元素即是文件路径,以只读的方式打开文件
  138.             f = open(filenames[0], 'r')
  139. self.ui.textEdit.setText(str(filenames[0]))
  140.             with f:
  141. # 接受读取的内容,并显示到多行文本框中
  142.                 data = f.read()
  143.                 data = data.replace('\n',' ')
  144. # print(type(data))
  145. self.kws = data.split()
  146. # print(self.kw[2])
  147. #print(data)
  148. if __name__ == '__main__':
  149.     app = tiebaUI.QtWidgets.QApplication(sys.argv)
  150.     MainWindow = tiebaUI.QtWidgets.QMainWindow()
  151. #实例化
  152.     ex = TieBa()
  153.     MainWindow.show()
  154. sys.exit(app.exec_())

以上代码可用于简单学习使用pyqt5制作爬虫的界面,并进行相关的逻辑绑定,最终实现一个可视化界面爬虫,最终制作出来的工具效果如下,打包程序也已经发出来,如果需要参考可以自行翻阅历史文章查找。(实在不知道该怎么写关键词来吸引蜘蛛收录...)

如果你有缘看到这里,并且对你产生了帮助,希望你简单的点个赞,谢谢~

HeyBy

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: