Maison > Article > développement back-end > Comment récupérer efficacement plusieurs URL à l'aide de QWebPage dans Qt ?
Dans ce scénario, vous avez tenté d'utiliser QWebPage de Qt pour afficher des pages mises à jour dynamiquement. Cependant, vous avez rencontré des plantages fréquents lors de la tentative d'affichage d'une deuxième page.
Analyse du problème
Le problème réside dans votre approche. Vous initialisez une nouvelle QApplication et une nouvelle QWebPage pour chaque récupération d'URL. Au lieu de cela, il est recommandé de conserver une seule QApplication et une seule QWebPage, en utilisant des signaux et un traitement personnalisé pour gérer plusieurs URL au sein de la même instance.
Solution proposée
Vous trouverez ci-dessous les classes WebPage personnalisées pour PyQt5 et PyQt4 :
Page Web PyQt5
<code class="python">from PyQt5.QtCore import pyqtSignal, QUrl from PyQt5.QtWidgets import QApplication from PyQt5.QtWebEngineWidgets import QWebEnginePage class WebPage(QWebEnginePage): htmlReady = pyqtSignal(str, str) def __init__(self, verbose=False): super().__init__() self._verbose = verbose self.loadFinished.connect(self.handleLoadFinished) def process(self, urls): self._urls = iter(urls) self.fetchNext() def fetchNext(self): try: url = next(self._urls) except StopIteration: return False else: self.load(QUrl(url)) return True def processCurrentPage(self, html): self.htmlReady.emit(html, self.url().toString()) if not self self.fetchNext(): QApplication.instance().quit() def handleLoadFinished(self): self.toHtml(self.processCurrentPage) def javaScriptConsoleMessage(self, *args, **kwargs): if self._verbose: super().javaScriptConsoleMessage(*args, **kwargs)</code>
Page Web PyQt4
<code class="python">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 process(self, urls): self._urls = iter(urls) self.fetchNext() def fetchNext(self): try: url = next(self._urls) except StopIteration: return False else: self.mainFram().load(QUrl(url)) return True def processCurrentPage(self): self.htmlReady.emit(self.mainFrame().toHtml(), self.mainFrame().url().toString()) if not self.fetchNext(): QApplication.instance().quit() def javaScripConsoleMessage(self ,* args, **kwargs): if self._verbose: super(WebPage, self).javaScriptConsoleMessage(*args, **kwargs)</code>
Voici un exemple d'utilisation de ces classes WebPage :
<code class="python">from PyQt5.QtCore import QUrl from PyQt5.QtWidgets import QApplication # PyQt5 url_list = ['https://example.com', 'https://example2.com'] app = QApplication(sys.argv) webpage = WebPage(verbose=True) webpage.htmlReady.connect(my_html_processor) webpage.process(url_list) sys.exit(app.exec_()) # PyQt4 from PyQt4.QtCore import QUrl from PyQt4.QtGui import QApplication url_list = ['https://example.com', 'https://example2.com'] app = QApplication(sys.argv) webpage = WebPage(verbose=True) webpage.htmlReady.connect(my_html_processor) webpage.process(url_list) sys.exit(app.exec_())</code>
Dans ce code, my_html_processor est une fonction qui peut être personnalisée pour gérer le HTML traité et Informations URL pour chaque page.
En mettant en œuvre cette approche, vous pouvez éviter les plantages et les comportements aléatoires que vous avez rencontrés auparavant, ce qui se traduit par un flux de travail de scraping Web plus stable et plus efficace.
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!