python:pyQT-QApplication-QwebPage实例如何抓取javascript完全销毁并重新初始化

2024-10-02 06:26:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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进程崩溃。在


Tags: selfloopclosedefpage页面myapppyqt

热门问题