Gestion de plusieurs requêtes de pages Web dans PyQt avec QWebPage
Lors de l'utilisation de QWebPage de PyQt pour récupérer du contenu dynamique, des plantages lors des demandes de chargement de page ultérieures peuvent être un problème courant. La cause première réside souvent dans une mauvaise gestion des ressources, entraînant des fuites de mémoire ou des problèmes de suppression d’objets. Pour résoudre ce problème, il est crucial de garder le contrôle sur la boucle d'événements de l'application et d'assurer un nettoyage approprié des ressources.
Solution :
Au lieu de créer plusieurs QApplications et instances de QWebPage pour chaque URL, adoptez un seul objet QApplication et un seul objet WebPage. Cette approche permet une gestion plus efficace des ressources et évite les pièges liés à la création et à la destruction d'objets à plusieurs reprises.
Pour y parvenir, le signal loadFinished de QWebPage peut être utilisé pour créer une boucle d'événements interne au sein de l'objet WebPage. En connectant un emplacement défini par l'utilisateur à ce signal, un traitement HTML personnalisé peut être effectué après le chargement de chaque page Web.
Utilisation :
Voici un exemple de la façon de utilisez la classe WebPage :
from PyQt4.QtCore import pyqtSignal, QUrl from PyQt4.QtGui import QApplication from PyQt4.QtWebKit import QWebPage class WebPage(QWebPage): htmlReady = pyqtSignal(str, str) def __init__(self, verbose=False): super(WebPage, self).__init__() self._verbose = verbose self.mainFrame().loadFinished.connect(self.handleLoadFinished) def start(self, urls): self._urls = iter(urls) self.fetchNext() def fetchNext(self): try: url = next(self._urls) except StopIteration: return False else: self.mainFrame().load(QUrl(url)) return True def processCurrentPage(self): self.htmlReady.emit( self.mainFrame().toHtml(), self.mainFrame().url().toString()) print('loaded: [%d bytes] %s' % (self.bytesReceived(), url)) def handleLoadFinished(self): self.processCurrentPage() if not self.fetchNext(): QApplication.instance().quit() def javaScriptConsoleMessage(self, *args, **kwargs): if self._verbose: super(WebPage, self).javaScriptConsoleMessage(*args, **kwargs)
Cette approche garantit une gestion appropriée de la durée de vie des objets et permet une gestion efficace de plusieurs requêtes de pages Web au sein d'une seule application PyQt.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!