Как использовать qtwebkit в потоках Python?

Я пытаюсь проанализировать веб-страницы, сгенерированные js, с помощью qtwebkit, я нашел пример того, как получить исходный код страницы:

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?

Ответы на вопрос(1)

методы 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_vie,w.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()
 andrean07 янв. 2015 г., 09:02
@ user1179442: его можно включить через:QWebView().settings().setAttribute(QWebSettings.JavascriptEnabled, False)
 user117944207 янв. 2015 г., 08:53
Как проанализировать веб-страницу (html + js) с помощью PySide или PtQt? Эти коды кажется, что не может разобрать JS
 andrean07 янв. 2015 г., 10:37
@ user1179442 действительно, извините за это :) (копировать / вставить)
 user117944208 янв. 2015 г., 05:48
У меня есть другой вопрос, что иногда результат выглядит не проанализированы все JS. Это связано с асинхронностью?
 user117944207 янв. 2015 г., 09:25
Спасибо за вашу информацию. Но второй аргумент должен быть «Верным» :)

Ваш ответ на вопрос