python3.4 веб-запрос Pyqt4 asyncio

98
9

Можно ли выполнить в asynchrone (например, с asyncio) веб-запросы в Pyqt4 (QwebPage)?

Например, как я могу вызвать несколько URL-адресов параллельно с этим кодом:

#!/usr/bin/env python3.4

import sys
import signal

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import QWebPage

class Crawler( QWebPage ):
def __init__(self, url):
QWebPage.__init__( self )
self._url = url
self.content = ''

def crawl( self ):
signal.signal( signal.SIGINT, signal.SIG_DFL )
self.connect( self, SIGNAL( 'loadFinished(bool)' ), self._finished_loading )
self.mainFrame().load( QUrl( self._url ) )

def _finished_loading( self, result ):
self.content = self.mainFrame().toHtml()
print(self.content)
sys.exit( 0 )

def main():
app = QApplication( sys.argv )
crawler = Crawler( self._url, self._file )
crawler.crawl()
sys.exit( app.exec_() )

if __name__ == '__main__':
crawl = Crawler( 'http://www.example.com')
crawl.main()

благодаря

спросил(а) 2014-12-09T19:55:00+03:00 5 лет, 9 месяцев назад
1
Решение
57

Вы не можете сделать self.mainFrame().load(QUrl(self._url)) работающий через asyncio, извините - метод реализован в самом Qt.

Но вы можете установить цикл событий quamash и асинхронно вызывать aiohttp.request coroutine для получения веб-страниц.

Однако путь к QWebPage не работает.

ответил(а) 2014-12-10T14:33:00+03:00 5 лет, 9 месяцев назад
42

Запросы уже выполняются асинхронно, поэтому все, что вам нужно сделать, это создать несколько экземпляров QWebPage.

Здесь простая демонстрация, основанная на вашем примере скрипта:

import sys, signal
from PyQt4 import QtCore, QtGui, QtWebKit

urls = [
'http://qt-project.org/doc/qt-4.8/qwebelement.html',
'http://qt-project.org/doc/qt-4.8/qwebframe.html',
'http://qt-project.org/doc/qt-4.8/qwebinspector.html',
'http://qt-project.org/doc/qt-4.8/qwebpage.html',
'http://qt-project.org/doc/qt-4.8/qwebsettings.html',
'http://qt-project.org/doc/qt-4.8/qwebview.html',
]

class Crawler(QtWebKit.QWebPage):
def __init__(self, url, identifier):
super(Crawler, self).__init__()
self.loadFinished.connect(self._finished_loading)
self._id = identifier
self._url = url
self.content = ''

def crawl(self):
self.mainFrame().load(QtCore.QUrl(self._url))

def _finished_loading(self, result):
self.content = self.mainFrame().toHtml()
print('[%d] %s' % (self._id, self._url))
print(self.content[:250].rstrip(), '...')
print()
self.deleteLater()

if __name__ == '__main__':

app = QtGui.QApplication( sys.argv )
signal.signal( signal.SIGINT, signal.SIG_DFL)
crawlers = []
for index, url in enumerate(urls):
crawlers.append(Crawler(url, index))
crawlers[-1].crawl()
sys.exit( app.exec_() )

ответил(а) 2014-12-10T21:35:00+03:00 5 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема