Maison  >  Article  >  développement back-end  >  Comment récupérer efficacement plusieurs URL à l'aide de QWebPage dans Qt ?

Comment récupérer efficacement plusieurs URL à l'aide de QWebPage dans Qt ?

DDD
DDDoriginal
2024-10-27 11:42:30662parcourir

How to Efficiently Retrieve Multiple URLs Using QWebPage in Qt?

Récupérer plusieurs URL avec QWebPage

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

Classe WebPage

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>

Utilisation

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn