Dalam senario ini, anda telah cuba menggunakan QWebPage Qt untuk memaparkan halaman yang dikemas kini secara dinamik. Walau bagaimanapun, anda sering mengalami ranap sistem apabila cuba memaparkan halaman kedua.
Analisis Masalah
Isunya terletak pada pendekatan anda. Anda memulakan QApplication dan QWebPage baharu untuk setiap pengambilan URL. Sebaliknya, adalah disyorkan untuk mengekalkan satu QApplication dan QWebPage, menggunakan isyarat dan pemprosesan tersuai untuk mengendalikan berbilang URL dalam keadaan yang sama.
Cadangan Penyelesaian
Di bawah ialah kelas Halaman Web tersuai untuk kedua-dua PyQt5 dan PyQt4:
Halaman 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>
Halaman Web PyQt4
Penggunaan<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>
<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>
Dengan melaksanakan pendekatan ini, anda boleh menghalang ranap sistem dan gelagat rawak yang anda alami sebelum ini, menghasilkan aliran kerja mengikis web yang lebih stabil dan cekap.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Berbilang URL dengan Cekap Menggunakan QWebPage dalam Qt?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!