使用PyQt5开发Scrapy爬虫的界面,利用CrawlerRunner启动爬虫,并利用PyQt5信号传递爬虫信息到界面
在上一篇Pyqt5和Scrapy开发可视化爬虫中,
使用了在Qt子线程中,利用subprocess开启一个终端进程来执行Scrapy启动命令,获取进程的标准输出,以实现向界面发送信息的功能。
但使用命令启动始终有很大的局限性,之前也试过用Crawler内部api启动,但苦于无法获取爬虫的当前运行情况,在研究了PyQt的多线程之后PYQT5开启多个线程和窗口,多线程与多窗口的交互,对于PyQt的信号,有了一个更深刻的理解。
之前在spider中无法使用pyqtsignal,是因为必须继承QObjct才能使用pyqtsignal,于是就将上篇博客中提到的方法利用起来,将自定义的pyqtsignal信号当成参数传递给爬虫spider,既可以在spider中发送信号给界面了。
1. 自定义继承QObject的signal类
class MySignal(QObject):
"""定义全局信号"""
# 通用信号
send_int = pyqtSignal(int)
send_str = pyqtSignal(str)
# 指定信号
item_scraped = pyqtSignal()
spider_closed = pyqtSignal()
2. 在子线程中定义signal变量
class RunThread(QRunnable):
"""child thread for spider task"""
def __init__(self, spider_name, keyword, trans_key):
super(RunThread, self)