文章目录

  • 一.准备工作
  • 二.预览
    • 1.启动
    • 2.搜索
    • 3.开始爬取
    • 4.结果
  • 三.设计流程
    • 1.整体流程
    • 2.UI设计(草图)
    • 3.UI设计(QT设计师)
  • 四.源代码
    • 1.Wei_Bo_pics_Crawl.py(主程序)
    • 2.WeiBo_Pics_Crawl.py(UI)
    • 3.Weibo_Crawl_Engine.py(爬虫)
  • 五.总结

之前写过一款python3GUI–微博图片爬取工具V1.5(附源码)
,是基于python自带的GUI开发包tkinter,实现了对指定用户图片的爬取,本次使用PyQt5,遵循UI界面与爬虫逻辑分离开来,实现思路大体相同,只不过tkinter与QT组件方法有所差别,走起~

一.准备工作

本程序是基于PyQt5的,需要额外安装一下,这里不多说。
UI界面的设计基于QT设计师,用它设计UI很方便。
关于以上模块、工具的安装可以参考PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)详细教程

二.预览

1.启动

怎么样,是不是熟悉的感觉

2.搜索

用户搜索会调用两个API进行检索,将搜索到的相关用户去重后,展示在组合框中。

3.开始爬取

选取完图片保存路径,点击开始爬取,程序就开始工作了,爬取状态会在表格中实时显示。

4.结果


仅拿一张图片作为展示。

三.设计流程

1.整体流程

2.UI设计(草图)

3.UI设计(QT设计师)

使用QT设计师,设计UI界面,使用QMainWindow作为模板,去除了工具栏与状态栏,保留了菜单栏,使用QLabel、QLineEdit、QPushButton、QCombobox、QTableWidget、QGroupBox等组件。整体垂直布局,局部水平布局。

四.源代码

1.Wei_Bo_pics_Crawl.py(主程序)

#-*-coding:utf-8-*-
import os
import sys
from threading import Thread
from PyQt5.Qt import QMainWindow,QMessageBox,QFileDialog,QMenu,QTableWidgetItem,QApplication
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QSize
from PyQt5.QtGui import QPixmap
from Weibo_Crawl_Engine import Weibo_Pic_Spider
from WeiBo_Pics_Crawl import Ui_MainWindow
"""图片可以爬取了,但是图片爬完的tablewidget显示还有问题    **已解决**
保存图片路径有问题,还要加上用户名子目录名称  **已实现**
1.加载网络图片
2.自定义信号槽,保证tablewidget在UI线程中
"""
class Wei_Bo_Pics_Crawl_Window(QMainWindow):single=pyqtSignal(str)def __init__(self):super().__init__()self.s=Weibo_Pic_Spider()self.current_path=os.getcwd()self.ui=Ui_MainWindow()self.ui.setupUi(self)self.setFixedSize(self.width(),self.height())self.ui.label_show_user_head_img.setMaximumSize(QSize(120,150))self.ui.comboBox_users.currentIndexChanged.connect(self.show_user_img)self.ui.pushButton_start_crawl.clicked.connect(lambda :self.thread_it(self.do_start_crawl))self.ui.action_quit_window.triggered.connect(self.close)self.ui.action_do_search.triggered.connect(self.do_search_users)self.ui.action_start_crawl.triggered.connect(self.do_start_crawl)self.ui.action_do_stop_crawl.triggered.connect(self.do_stop_crawl)self.ui.action_open_dir.triggered.connect(self.open_dir)self.ui.action_show_about_author.triggered.connect(lambda :QMessageBox.information(self,'关于作者','作者:懷淰メ\nBy:PyQt5'))self.ui.tableWidget_show_satauts.customContextMenuRequested.connect(self.show_right_menu)self.ui.pushButton_stop_crawl.clicked.connect(self.do_stop_crawl)self.single[str].connect(self.insert_into_table_widget)def do_search_users(self):self.ui.comboBox_users.clear()self.s.user_list.clear()key_word=self.ui.lineEdit_keyword.text()if key_word !='':self.search_result=self.s.get_users(key_word)if self.search_result:user_names=[user_['user_name'] for user_ in self.search_result]self.ui.comboBox_users.addItems(user_names)self.ui.pushButton_start_crawl.setEnabled(True)self.ui.action_start_crawl.setEnabled(True)else:QMessageBox.information(self,'提示',f'很抱歉,没有检索到关于[{key_word}]的用户!')else:QMessageBox.warning(self,'警告','关键字不能为空!')def do_select_save_path(self):while True:dir_choose = QFileDialog.getExistingDirectory(self,"选择要视频图片的文件夹",self.current_path)  # 起始路径if dir_choose!='':self.ui.lineEdit_save_path.setText(dir_choose)breakdef do_start_crawl(self):save_path = self.ui.lineEdit_save_path.text()if save_path == '':QMessageBox.warning(self, '警告', '存储路径不能为空!')else:if os.path.isdir(save_path):self.ui.tableWidget_show_satauts.clear()self.ui.tableWidget_show_satauts.setRowCount(0)self.ui.tableWidget_show_satauts.setHorizontalHeaderLabels(['状态'])combobox_current_index = self.ui.comboBox_users.currentIndex()user_name = self.search_result[combobox_current_index]['user_name']user_id = self.search_result[combobox_current_index]['user_id']self.pic_save_dir = save_path + '/' + user_nameos.makedirs(self.pic_save_dir,exist_ok=True)self.s.set_start_url(user_id=user_id)self.ui.pushButton_start_crawl.setEnabled(False)self.ui.action_start_crawl.setEnabled(False)self.ui.pushButton_stop_crawl.setEnabled(True)self.ui.action_do_stop_crawl.setEnabled(True)self.running_flag=Trueself.do_download_pics()if self.ui.action_open_dir_after_crawl.isChecked():os.startfile(self.pic_save_dir)self.ui.pushButton_start_crawl.setEnabled(True)self.ui.action_start_crawl.setEnabled(True)self.ui.action_do_stop_crawl.setEnabled(False)else:QMessageBox.warning(self, '警告', '所选目录不合法!')self.ui.lineEdit_save_path.setText('')def do_download_pics(self):for pic in self.s.get_pics_url():if self.running_flag:file_name = pic.split('/')[-1]self.s.do_download_pic(pic, file_name, self.pic_save_dir)self.single.emit(file_name)else:self.single.emit('程序已停止!')breakif self.running_flag:self.single.emit('图片爬取结束!')def show_user_img(self,index):current_user_item=self.search_result[index]user_header_img_url=current_user_item['user_head_img']pix_map=QPixmap()header_img_bytes=self.s.get_img_bytes(user_header_img_url)pix_map.loadFromData(header_img_bytes)self.ui.label_show_user_head_img.setPixmap(pix_map)def do_stop_crawl(self):self.single.emit('程序正在停止,请耐心等待...')self.running_flag=Falseself.ui.pushButton_start_crawl.setEnabled(True)self.ui.action_start_crawl.setEnabled(True)self.ui.action_do_stop_crawl.setEnabled(False)self.ui.pushButton_stop_crawl.setEnabled(False)def show_right_menu(self,pos):menu=QMenu()item=menu.addAction('查看此图片')screen_pos=self.ui.tableWidget_show_satauts.mapToGlobal(pos)action = menu.exec(screen_pos)if action==item:try:current_pic_name=self.ui.tableWidget_show_satauts.currentItem().text()pic_path=self.pic_save_dir+'/'+current_pic_nameos.startfile(pic_path)except AttributeError:QMessageBox.warning(self,'警告','请务必选择一张图片!')except FileNotFoundError:QMessageBox.warning(self,'警告','此为系统消息!')def closeEvent(self,event):reply = QMessageBox.question(self, '关闭', "确定要退出吗?",QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)if reply == QMessageBox.Yes:event.accept()else:event.ignore()@pyqtSlot(str)def insert_into_table_widget(self,line):row_num=self.ui.tableWidget_show_satauts.rowCount()self.ui.tableWidget_show_satauts.setRowCount(row_num+1)new_table_widget_item=QTableWidgetItem(line)self.ui.tableWidget_show_satauts.setItem(row_num,0,new_table_widget_item)self.ui.tableWidget_show_satauts.scrollToBottom()def open_dir(self):try:os.startfile(self.save_path)except AttributeError:QMessageBox.warning(self,'警告','请先开始爬取图片!')def thread_it(self,func,*args):t=Thread(target=func,args=args)t.setDaemon(True)t.start()if __name__ == '__main__':app=QApplication(sys.argv)ui=Wei_Bo_Pics_Crawl_Window()ui.show()sys.exit(app.exec_())

2.WeiBo_Pics_Crawl.py(UI)

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'WeiBo_Pics_Crawl.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.setEnabled(True)MainWindow.resize(496, 466)MainWindow.setMouseTracking(False)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)self.verticalLayout_2.setObjectName("verticalLayout_2")self.horizontalLayout_2 = QtWidgets.QHBoxLayout()self.horizontalLayout_2.setContentsMargins(10, 3, 10, -1)self.horizontalLayout_2.setObjectName("horizontalLayout_2")self.label = QtWidgets.QLabel(self.centralwidget)self.label.setObjectName("label")self.horizontalLayout_2.addWidget(self.label)self.lineEdit_keyword = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_keyword.setMinimumSize(QtCore.QSize(227, 0))self.lineEdit_keyword.setMaximumSize(QtCore.QSize(227, 24))self.lineEdit_keyword.setAlignment(QtCore.Qt.AlignCenter)self.lineEdit_keyword.setObjectName("lineEdit_keyword")self.horizontalLayout_2.addWidget(self.lineEdit_keyword)spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_2.addItem(spacerItem)self.pushButton_do_search = QtWidgets.QPushButton(self.centralwidget)self.pushButton_do_search.setObjectName("pushButton_do_search")self.horizontalLayout_2.addWidget(self.pushButton_do_search)self.verticalLayout_2.addLayout(self.horizontalLayout_2)self.horizontalLayout_3 = QtWidgets.QHBoxLayout()self.horizontalLayout_3.setContentsMargins(10, -1, 10, -1)self.horizontalLayout_3.setObjectName("horizontalLayout_3")self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setObjectName("label_2")self.horizontalLayout_3.addWidget(self.label_2)self.lineEdit_save_path = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_save_path.setMinimumSize(QtCore.QSize(227, 0))self.lineEdit_save_path.setMaximumSize(QtCore.QSize(227, 24))self.lineEdit_save_path.setAlignment(QtCore.Qt.AlignCenter)self.lineEdit_save_path.setObjectName("lineEdit_save_path")self.horizontalLayout_3.addWidget(self.lineEdit_save_path)spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_3.addItem(spacerItem1)self.pushButton_select_save_path = QtWidgets.QPushButton(self.centralwidget)self.pushButton_select_save_path.setObjectName("pushButton_select_save_path")self.horizontalLayout_3.addWidget(self.pushButton_select_save_path)self.verticalLayout_2.addLayout(self.horizontalLayout_3)self.horizontalLayout_4 = QtWidgets.QHBoxLayout()self.horizontalLayout_4.setContentsMargins(10, -1, 10, -1)self.horizontalLayout_4.setObjectName("horizontalLayout_4")self.label_3 = QtWidgets.QLabel(self.centralwidget)self.label_3.setObjectName("label_3")self.horizontalLayout_4.addWidget(self.label_3)self.comboBox_users = QtWidgets.QComboBox(self.centralwidget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.comboBox_users.sizePolicy().hasHeightForWidth())self.comboBox_users.setSizePolicy(sizePolicy)self.comboBox_users.setMinimumSize(QtCore.QSize(227, 0))self.comboBox_users.setMaximumSize(QtCore.QSize(227, 24))self.comboBox_users.setMaxVisibleItems(30)self.comboBox_users.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents)self.comboBox_users.setObjectName("comboBox_users")self.horizontalLayout_4.addWidget(self.comboBox_users)spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_4.addItem(spacerItem2)self.pushButton_start_crawl = QtWidgets.QPushButton(self.centralwidget)self.pushButton_start_crawl.setEnabled(False)self.pushButton_start_crawl.setMaximumSize(QtCore.QSize(93, 16777215))self.pushButton_start_crawl.setObjectName("pushButton_start_crawl")self.horizontalLayout_4.addWidget(self.pushButton_start_crawl)self.verticalLayout_2.addLayout(self.horizontalLayout_4)self.horizontalLayout_9 = QtWidgets.QHBoxLayout()self.horizontalLayout_9.setContentsMargins(-1, -1, 10, -1)self.horizontalLayout_9.setObjectName("horizontalLayout_9")spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_9.addItem(spacerItem3)self.pushButton_stop_crawl = QtWidgets.QPushButton(self.centralwidget)self.pushButton_stop_crawl.setEnabled(False)self.pushButton_stop_crawl.setMaximumSize(QtCore.QSize(93, 16777215))self.pushButton_stop_crawl.setObjectName("pushButton_stop_crawl")self.horizontalLayout_9.addWidget(self.pushButton_stop_crawl)self.verticalLayout_2.addLayout(self.horizontalLayout_9)self.horizontalLayout_7 = QtWidgets.QHBoxLayout()self.horizontalLayout_7.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)self.horizontalLayout_7.setContentsMargins(-1, -1, 10, -1)self.horizontalLayout_7.setObjectName("horizontalLayout_7")self.horizontalLayout_5 = QtWidgets.QHBoxLayout()self.horizontalLayout_5.setContentsMargins(10, -1, 0, -1)self.horizontalLayout_5.setObjectName("horizontalLayout_5")self.label_4 = QtWidgets.QLabel(self.centralwidget)self.label_4.setObjectName("label_4")self.horizontalLayout_5.addWidget(self.label_4)self.tableWidget_show_satauts = QtWidgets.QTableWidget(self.centralwidget)self.tableWidget_show_satauts.setMinimumSize(QtCore.QSize(227, 0))font = QtGui.QFont()font.setFamily("微软雅黑")font.setPointSize(7)self.tableWidget_show_satauts.setFont(font)self.tableWidget_show_satauts.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)self.tableWidget_show_satauts.setAlternatingRowColors(True)self.tableWidget_show_satauts.setTextElideMode(QtCore.Qt.ElideMiddle)self.tableWidget_show_satauts.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)self.tableWidget_show_satauts.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)self.tableWidget_show_satauts.setObjectName("tableWidget_show_satauts")self.tableWidget_show_satauts.setColumnCount(1)self.tableWidget_show_satauts.setRowCount(0)item = QtWidgets.QTableWidgetItem()self.tableWidget_show_satauts.setHorizontalHeaderItem(0, item)self.tableWidget_show_satauts.horizontalHeader().setStretchLastSection(True)self.tableWidget_show_satauts.verticalHeader().setDefaultSectionSize(20)self.tableWidget_show_satauts.verticalHeader().setMinimumSectionSize(18)self.horizontalLayout_5.addWidget(self.tableWidget_show_satauts)spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_5.addItem(spacerItem4)self.horizontalLayout_6 = QtWidgets.QHBoxLayout()self.horizontalLayout_6.setContentsMargins(0, -1, -1, -1)self.horizontalLayout_6.setSpacing(0)self.horizontalLayout_6.setObjectName("horizontalLayout_6")self.groupBox = QtWidgets.QGroupBox(self.centralwidget)self.groupBox.setObjectName("groupBox")self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox)self.verticalLayout.setObjectName("verticalLayout")self.label_show_user_head_img = QtWidgets.QLabel(self.groupBox)self.label_show_user_head_img.setMinimumSize(QtCore.QSize(93, 0))self.label_show_user_head_img.setAutoFillBackground(False)self.label_show_user_head_img.setStyleSheet("QLabel{\n"
"background-color:rgb(173, 216, 230);\n"
"position:absolute;\n"
"bottom:1;\n"
"}")self.label_show_user_head_img.setText("")self.label_show_user_head_img.setTextFormat(QtCore.Qt.AutoText)self.label_show_user_head_img.setScaledContents(True)self.label_show_user_head_img.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)self.label_show_user_head_img.setObjectName("label_show_user_head_img")self.verticalLayout.addWidget(self.label_show_user_head_img)self.horizontalLayout_6.addWidget(self.groupBox)self.horizontalLayout_5.addLayout(self.horizontalLayout_6)self.horizontalLayout_7.addLayout(self.horizontalLayout_5)self.verticalLayout_2.addLayout(self.horizontalLayout_7)self.horizontalLayout = QtWidgets.QHBoxLayout()self.horizontalLayout.setObjectName("horizontalLayout")self.frame = QtWidgets.QFrame(self.centralwidget)self.frame.setLayoutDirection(QtCore.Qt.LeftToRight)self.frame.setStyleSheet("color: rgb(255, 0, 0);")self.frame.setFrameShape(QtWidgets.QFrame.Box)self.frame.setFrameShadow(QtWidgets.QFrame.Raised)self.frame.setObjectName("frame")self.horizontalLayout_8 = QtWidgets.QHBoxLayout(self.frame)self.horizontalLayout_8.setContentsMargins(10, -1, 10, -1)self.horizontalLayout_8.setObjectName("horizontalLayout_8")spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_8.addItem(spacerItem5)spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_8.addItem(spacerItem6)self.label_6 = QtWidgets.QLabel(self.frame)self.label_6.setAlignment(QtCore.Qt.AlignCenter)self.label_6.setObjectName("label_6")self.horizontalLayout_8.addWidget(self.label_6)spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_8.addItem(spacerItem7)spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_8.addItem(spacerItem8)self.horizontalLayout.addWidget(self.frame)self.verticalLayout_2.addLayout(self.horizontalLayout)MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 496, 26))self.menubar.setObjectName("menubar")self.menu = QtWidgets.QMenu(self.menubar)self.menu.setObjectName("menu")self.menu_2 = QtWidgets.QMenu(self.menubar)self.menu_2.setObjectName("menu_2")self.menu_3 = QtWidgets.QMenu(self.menubar)self.menu_3.setObjectName("menu_3")MainWindow.setMenuBar(self.menubar)self.action_open_dir = QtWidgets.QAction(MainWindow)self.action_open_dir.setObjectName("action_open_dir")self.action_quit_window = QtWidgets.QAction(MainWindow)self.action_quit_window.setObjectName("action_quit_window")self.action_do_search = QtWidgets.QAction(MainWindow)self.action_do_search.setObjectName("action_do_search")self.action_start_crawl = QtWidgets.QAction(MainWindow)self.action_start_crawl.setEnabled(False)self.action_start_crawl.setObjectName("action_start_crawl")self.action_open_dir_after_crawl = QtWidgets.QAction(MainWindow)self.action_open_dir_after_crawl.setCheckable(True)self.action_open_dir_after_crawl.setObjectName("action_open_dir_after_crawl")self.action_show_about_author = QtWidgets.QAction(MainWindow)self.action_show_about_author.setObjectName("action_show_about_author")self.action_do_stop_crawl = QtWidgets.QAction(MainWindow)self.action_do_stop_crawl.setEnabled(False)self.action_do_stop_crawl.setObjectName("action_do_stop_crawl")self.menu.addAction(self.action_open_dir)self.menu.addSeparator()self.menu.addAction(self.action_quit_window)self.menu_2.addAction(self.action_do_search)self.menu_2.addAction(self.action_start_crawl)self.menu_2.addAction(self.action_do_stop_crawl)self.menu_2.addSeparator()self.menu_2.addAction(self.action_open_dir_after_crawl)self.menu_3.addAction(self.action_show_about_author)self.menubar.addAction(self.menu.menuAction())self.menubar.addAction(self.menu_2.menuAction())self.menubar.addAction(self.menu_3.menuAction())self.retranslateUi(MainWindow)self.pushButton_do_search.clicked.connect(MainWindow.do_search_users)self.pushButton_select_save_path.clicked.connect(MainWindow.do_select_save_path)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "微博图片小爬虫-V1.5"))self.label.setText(_translate("MainWindow", "关键字:  "))self.lineEdit_keyword.setPlaceholderText(_translate("MainWindow", "请输入关键字"))self.pushButton_do_search.setText(_translate("MainWindow", "搜索"))self.pushButton_do_search.setShortcut(_translate("MainWindow", "Return"))self.label_2.setText(_translate("MainWindow", "保存位置:"))self.lineEdit_save_path.setPlaceholderText(_translate("MainWindow", "请选择路径"))self.pushButton_select_save_path.setText(_translate("MainWindow", "选择"))self.pushButton_select_save_path.setShortcut(_translate("MainWindow", "Ctrl+Shift+D"))self.label_3.setText(_translate("MainWindow", "用户列表:"))self.pushButton_start_crawl.setText(_translate("MainWindow", "开始爬取"))self.pushButton_start_crawl.setShortcut(_translate("MainWindow", "Ctrl+Shift+S"))self.pushButton_stop_crawl.setText(_translate("MainWindow", "停止爬取"))self.label_4.setText(_translate("MainWindow", "当前状态:"))item = self.tableWidget_show_satauts.horizontalHeaderItem(0)item.setText(_translate("MainWindow", "状态"))self.groupBox.setTitle(_translate("MainWindow", "用户头像"))self.label_6.setText(_translate("MainWindow", "敬告:本软件仅供学习交流使用"))self.menu.setTitle(_translate("MainWindow", "开始"))self.menu_2.setTitle(_translate("MainWindow", "操作"))self.menu_3.setTitle(_translate("MainWindow", "关于"))self.action_open_dir.setText(_translate("MainWindow", "打开文件夹"))self.action_open_dir.setShortcut(_translate("MainWindow", "Ctrl+O"))self.action_quit_window.setText(_translate("MainWindow", "退出"))self.action_quit_window.setShortcut(_translate("MainWindow", "Ctrl+Q"))self.action_do_search.setText(_translate("MainWindow", "搜索"))self.action_do_search.setShortcut(_translate("MainWindow", "Ctrl+Return"))self.action_start_crawl.setText(_translate("MainWindow", "开始爬取"))self.action_start_crawl.setShortcut(_translate("MainWindow", "Ctrl+Shift+S"))self.action_open_dir_after_crawl.setText(_translate("MainWindow", "爬取完成后打开文件夹"))self.action_show_about_author.setText(_translate("MainWindow", "关于作者"))self.action_show_about_author.setShortcut(_translate("MainWindow", "Ctrl+B"))self.action_do_stop_crawl.setText(_translate("MainWindow", "停止爬取"))self.action_do_stop_crawl.setShortcut(_translate("MainWindow", "Ctrl+Shift+B"))

3.Weibo_Crawl_Engine.py(爬虫)

由于篇幅,Weibo_Crawl_Engine.py的代码详见:

python3GUI–微博图片爬取工具V1.5(附源码)

五.总结

本次使用PyQt5撰写一款微博图片爬取工具,在爬取过程中遇到了两个难点问题:
1.Qlabel显示网络图片
此问题解决参考了pyqt5加载网路图片,不本地下载。
2.自定义信号槽,保证tablewidget在UI线程中
此问题解决参考了PyQt 5信号与槽的几种高级玩法
感谢各位!程序打包好放在了百度云 密码:8888。思路、代码方面有什么不足欢迎各位大佬指正、批评!

python3GUI--微博图片爬取工具V1.5 By:PyQt5(附源码)相关推荐

  1. python写图片爬取软件_python制作微博图片爬取工具

    有小半个月没有发博客了,因为一直在研究python的GUI,买了一本书学习了一些基础,用我所学做了我的第一款GUI--微博图片爬取工具.本软件源代码已经放在了博客中,另外软件已经打包好上传到网盘中以供 ...

  2. python1080p壁纸高清图片_Python爬取高清桌面壁纸(附源码),直接运行即可

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于云+社区,作者 深雾 转载地址 https://blog.c ...

  3. Python爬虫实战,requests+openpyxl模块,爬取手机商品信息数据(附源码)

    前言 今天给大家介绍的是Python爬取手机商品信息数据,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本 ...

  4. Python3网络爬虫--爬取歌词并制作GUI(附源码)

    文章目录 一.准备工作 1.1Python开发环境 1.2Python开发工具 二.思路 1.爬虫整体思路 2.爬虫代码思路 三.网页分析 3.1数据确定 3.2网页数据加载方式分析 3.3确定数据所 ...

  5. Python爬取高清桌面壁纸(附源码),直接运行即可

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于云+社区,作者 深雾 转载地址 https://blog.c ...

  6. Python爬虫教程:爬取王者荣耀全套皮肤【附源码】

    怎么获取全套皮肤?用钱买,或者用爬虫爬取下来~虽然后者不能穿.这个案例稍微复杂一点,但是一个非常值得学习的项目. 具体实现思路: 分析网页源代码结构 找到合适的入口 穷举访问并解析 爬取所有英雄所有皮 ...

  7. Python爬取一个网站的所有图片(附源码)

    前面搭建爬虫环境完成第一个实例爬取信息,今天继续,Python第二个项目:爬取一个网站的所有图片,看到一个网站的图片,想要弄到本地,一张张保存太过于麻烦,于是,往下看: 爬取目标网站:https:// ...

  8. python爬百度翻译-爬虫 python爬取百度翻译接口 超详细附源码

    前言 今天教大家如何利用 firefox 分析百度翻译的接口,并用python爬取接口.大家学会后可以干一些有趣的事情,比如做一个自己的翻译软件. 具体内容 1 - 找到URL接口 进入百度翻译的网址 ...

  9. 一个web图片热点生成工具(winform开发) 附源码

    给图片加热点是web开发中经常用到的一个功能.这方面的工具也不少. 为了更好的满足自己的需求,写了一个winform程序. 可以方便的给图片加热点,更方便灵活! 源码下载 http://downloa ...

  10. python爬取笔趣阁小说(附源码)

    python爬取笔趣阁小说 文章目录 python爬取笔趣阁小说 前言 一.获取小说目录结构 获取目录连接 请求代码 解析目录 XPath tqdm 解析 二.获取小说章节结构 请求代码 解析章节 代 ...

最新文章

  1. Linux下为什么ls直接就可以运行,而你的程序要写./dir1/dir2/bin/bwa才可以
  2. gdb C++程序coredump不显示行号问题
  3. OpenCV提供的各种阈值选项的实例(附完整代码)
  4. ProE二次开发之VS2005+ProE Wildfire 4.0开发环境配置
  5. hdoj3652 B-number
  6. linux# 解读wmctrl一览输出的项目
  7. 关于SRTM精度的讨论[文摘]
  8. bat脚本转成exe执行程序
  9. Windows10必装的宝藏便签软件不用起来太可惜了
  10. Spring boot Redis 乱码
  11. 日记 [2006年06月06日] 庞加莱猜想
  12. Vue 的双向数据绑定原理是什么?
  13. sqlite数据库的版本更替
  14. 【Agni-s Philosophy】使用的图形技术解说(后篇)Volume渲染和粒子处理
  15. 异构群体机器人协作任务分配(群体智能论文学习)
  16. 第五章:MySQL主从复制
  17. VBA小模板,一个不放回的抽奖用的例子
  18. 基于 Matlab的录屏软件
  19. 我的2018:自由职业的冰火两重天
  20. geotools 的书籍

热门文章

  1. Java单词首字母小写转大写
  2. 如何确定聚类簇数 (k)
  3. 算法复杂度和合并果子题解
  4. layui表格时间类型显示问题
  5. java获取中文首字母
  6. 小白易学--ps拼接图片教程之照片拼图
  7. pc端分享到微信、微博、facebook、twitter
  8. ZOJ - Triathlon(线性规划+半平面交)
  9. 如何查看自己电脑的本地IP地址
  10. mysql数值比中文检索快_【mysql】利用全文索引实现中文的快速查找