QWebPage を使用した PyQt での複数の Web ページ リクエストの処理
PyQt の QWebPage を使用して動的コンテンツを取得すると、後続のページ読み込みリクエストでクラッシュが発生する可能性があります。共通の問題になります。根本的な原因は不適切なリソース管理にあることが多く、メモリ リークやオブジェクト削除の問題が発生します。これを解決するには、アプリケーションのイベント ループの制御を維持し、リソースのクリーンアップを適切に行うことが重要です。
解決策:
複数の QApplication と QWebPage のインスタンスを作成する代わりに、各 URL には、単一の QApplication オブジェクトと単一の WebPage オブジェクトが採用されます。このアプローチにより、より効率的なリソース管理が可能になり、オブジェクトの作成と破棄を繰り返すという落とし穴を回避できます。
これを実現するには、QWebPage のloadFinished シグナルを利用して、WebPage オブジェクト内に内部イベント ループを作成できます。ユーザー定義のスロットをこの信号に接続すると、各 Web ページが読み込まれた後にカスタム HTML 処理を実行できます。
使用法:
方法の例を次に示します。 WebPage クラスを使用します:
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 start(self, urls): self._urls = iter(urls) self.fetchNext() def fetchNext(self): try: url = next(self._urls) except StopIteration: return False else: self.mainFrame().load(QUrl(url)) return True def processCurrentPage(self): self.htmlReady.emit( self.mainFrame().toHtml(), self.mainFrame().url().toString()) print('loaded: [%d bytes] %s' % (self.bytesReceived(), url)) def handleLoadFinished(self): self.processCurrentPage() if not self.fetchNext(): QApplication.instance().quit() def javaScriptConsoleMessage(self, *args, **kwargs): if self._verbose: super(WebPage, self).javaScriptConsoleMessage(*args, **kwargs)
このアプローチにより、オブジェクトの有効期間管理が適切に行われ、単一の PyQt アプリケーション内で複数の Web ページ リクエストを効率的に処理できるようになります。
以上がPyQt の QWebPage を使用して、クラッシュを発生させずに複数の Web ページ リクエストを効率的に処理し、適切なリソース管理を確保するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。