Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich mit QWebPage in Qt effizient mehrere URLs abrufen?

Wie kann ich mit QWebPage in Qt effizient mehrere URLs abrufen?

DDD
DDDOriginal
2024-10-27 11:42:30576Durchsuche

How to Efficiently Retrieve Multiple URLs Using QWebPage in Qt?

Mehrere URLs mit QWebPage abrufen

In diesem Szenario haben Sie versucht, QWebPage von Qt zum Rendern dynamisch aktualisierter Seiten zu verwenden. Beim Versuch, eine zweite Seite zu rendern, kam es jedoch häufig zu Abstürzen.

Problemanalyse

Das Problem liegt in Ihrem Ansatz. Sie initialisieren eine neue QApplication und QWebPage für jeden URL-Abruf. Stattdessen wird empfohlen, eine einzige QApplication und QWebPage zu verwalten und Signale und benutzerdefinierte Verarbeitung zu verwenden, um mehrere URLs innerhalb derselben Instanz zu verarbeiten.

Vorgeschlagene Lösung

WebPage-Klasse

Unten finden Sie benutzerdefinierte WebPage-Klassen für PyQt5 und PyQt4:

PyQt5 WebPage

<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>

PyQt4 WebPage

<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>

Verwendung

Hier ist ein Beispiel für die Verwendung dieser WebPage-Klassen:

<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>

In diesem Code ist my_html_processor eine Funktion, die angepasst werden kann, um das verarbeitete HTML zu verarbeiten und URL-Informationen für jede Seite.

Durch die Implementierung dieses Ansatzes können Sie Abstürze und zufälliges Verhalten verhindern, die Sie zuvor erlebt haben, was zu einem stabileren und effizienteren Web-Scraping-Workflow führt.

Das obige ist der detaillierte Inhalt vonWie kann ich mit QWebPage in Qt effizient mehrere URLs abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn