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