我用python的Scrapy生成的JavaScript页面。这样做有很多种选择,包括Splash、Selenium等对接中间件。在
我已经决定通过运行PyQT实例(with.QWebPage())来解决这个问题,它有一个WebKit解释器,因此可以解析.js
考虑到要抓取的页面的规模,我希望按顺序运行许多作业,并在它们之间完全重新初始化PyQT。但是,我似乎不能完全重新初始化PyQT!在
代码很复杂,但我从StackOverflower同事那里得到的这个简单、独立的示例似乎也有同样的问题:;)
from PyQt4 import QtCore, QtGui, QtWebKit
import sys
class PyQTRenderer(object):
def __init__(self):
self.myApp = QtGui.QApplication(sys.argv)
def loadpage(self, url):
page = QtWebKit.QWebPage()
loop = QtCore.QEventLoop()
page.mainFrame().loadFinished.connect(loop.quit)
page.mainFrame().load(QtCore.QUrl(url))
loop.exec_()
return page.mainFrame().toHtml().toAscii()
def close(self):
print("exiting app")
self.myApp.closeAllWindows()
self.myApp.exit()
# something else maybe???
myRenderer = PyQTRenderer()
print myRenderer.loadpage('https://google.com')[1:100], " google"
print myRenderer.loadpage('https://bing.com')[1:100], " bing"
myRenderer.close()
myRenderer2 = PyQTRenderer()
print myRenderer2.loadpage('http://wikipedia.org')[1:100], "wikipedia (fails)"
myRenderer2.close()
预期产出应该是
^{pr2}$相反,我得到:
^{3}$如果我尝试使用del(myRenderer),myrendere2会抛出一堆关于无法连接到多个QTApp网络进程的错误。因此,似乎closeAllWindows()和exit()并不像我想象的那样工作,而且底层的pyQT库仍然在后台运行。在
我的问题:如何完全重新初始化PyQT,以便能够连续实例化不同的pyqtrender()?在
提前谢谢!在
编辑:myApp.退出()也不是一个可能的解决方案——至少在当前的实现中是这样的——因为在我的代码中,它所做的就是使主python进程崩溃。在
目前没有回答
相关问题 更多 >
编程相关推荐