【问题标题】:How to use qtwebkit in python threads?如何在 python 线程中使用 qtwebkit?
【发布时间】:2012-10-13 18:07:04
【问题描述】:

我正在尝试用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 生成的网页?

【问题讨论】:

    标签: python multithreading qtwebkit


    【解决方案1】:

    鉴于 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()
    

    【讨论】:

    • 如何使用 PySide 或 PtQt 解析网页(html +js)?这些代码似乎无法解析JS
    • @user1179442:可以通过:QWebView().settings().setAttribute(QWebSettings.JavascriptEnabled, False)
    • 感谢您的信息。但第二个参数应该是“真”:)
    • @user1179442 确实,对此感到抱歉:)(复制/粘贴)
    • 我还有一个问题,有时结果看起来并没有解析所有的 js。是因为异步吗?
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多