python - 如何在Python线程中使用qtwebkit?

标签 python multithreading qtwebkit

我正在尝试使用qtwebkit解析js生成的网页,我找到了如何获取页面源的示例:

import sys
from PySide.QtGui import *
from PySide.QtCore import *
from PySide.QtWebKit import *
class Render(QWebPage):
  def __init__(self, url):
       self.app = QApplication(sys.argv)
       QWebPage.__init__(self)
       self.loadFinished.connect(self._loadFinished)
       self.mainFrame().load(QUrl(url))
       self.app.exec_()

  def _loadFinished(self, result):
       self.frame = self.mainFrame()
       self.app.quit()
url = 'http://www.thesite.gov/search'
r = Render(url)
html = r.frame.toHtml()

但我不知道如何让它在线程中工作。 那么,如何做到这一点,如果不可能的话 - 是否有另一种快速方法来获取 js 生成的网页?

最佳答案

考虑到 QT 的异步特性,QtWebkit 方法也是非阻塞的,因此没有必要在线程中运行它们。您可以像这样并行启动它们:

from functools import partial

from PySide.QtCore import QUrl
from PySide.QtGui import QApplication
from PySide.QtWebKit import QWebView, QWebSettings


TARGET_URLS = (
    'http://stackoverflow.com',
    'http://github.com',
    'http://bitbucket.org',
    'http://news.ycombinator.com',
    'http://slashdot.org',
    'http://www.reddit.com',
    'http://www.dzone.com',
    'http://www.ideone.com',
    'http://jsfiddle.net',
)


class Crawler(object):

    def __init__(self, app):
        self.app = app
        self.results = dict()
        self.browsers = dict()

    def _load_finished(self, browser_id, ok):
        print ok, browser_id
        web_view, _flag = self.browsers[browser_id]
        self.browsers[browser_id] = (web_view, True)

        frame = web_view.page().mainFrame()
        self.results[frame.url()] = frame.toHtml()

        web_view.loadFinished.disconnect()
        web_view.stop()

        if all([closed for bid, closed in self.browsers.values()]):
            print 'all finished'
            self.app.quit()

    def start(self, urls):
        for browser_id, url in enumerate(urls):
            web_view = QWebView()
            web_view.settings().setAttribute(QWebSettings.AutoLoadImages,
                                             False)
            loaded = partial(self._load_finished, browser_id)
            web_view.loadFinished.connect(loaded)
            web_view.load(QUrl(url))
            self.browsers[browser_id] = (web_view, False)


if __name__ == '__main__':
    app = QApplication([])
    crawler = Crawler(app)
    crawler.start(TARGET_URLS)
    app.exec_()
    print 'got:', crawler.results.keys()

关于python - 如何在Python线程中使用qtwebkit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12863412/

相关文章:

python - 使用自制软件在 mac 上安装 python 中的 OpenCV

python - 为什么 Python 中没有 'const'?

java - 在Jframe中添加循环

c++ - 原子读取是否保证读取到最新值?

qt - 如何告诉QWebPage不要加载特定类型的资源?

javascript - 奇怪的浏览器描述PyQt

c++ - 未解析的外部符号。 C++

python-asyncio:走协程链

c# - 从另一个线程在窗体上添加控件

python - 将 2D numpy 数组转换为 2D numpy 矩阵