Qt の QWebPage で複数の Web ページをスクレイピングするときにクラッシュを回避する方法
Qt の QWebPage は動的なコンテンツのレンダリングを容易にし、Web スクレイピング タスクを可能にします。ただし、複数のページをロードしようとすると、特に基になる QWebPage オブジェクトが適切に管理されていない場合、クラッシュが発生することがよくあります。
ページの繰り返し読み込みの問題
同じ QWebPage インスタンスを使用してページを繰り返しロードすると、オブジェクトの不適切な削除により予期しない問題が発生する可能性があります。安定性を確保するには、QWebPage を 1 つだけ作成し、URL ごとに複数のインスタンスを作成しないことが重要です。
解決策: 再利用可能な QWebPage の作成
これに対処するには、複数の URL ロードを処理できる単一の QWebPage オブジェクトを使用するコード。各読み込みが完了すると、ページは次の URL をフェッチする内部ループをトリガーします。このアプローチにより、クラッシュの原因となる複数の QApplication および QWebPage の作成が不要になります。
改良された QWebPage を使用したコード例
これは、の使用法を示す更新された例です。再利用可能な QWebPage:
<code class="python">from PyQt5.QtCore import QUrl, pyqtSignal 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 load_urls(self, urls): self._urls = iter(urls) self.load_next() def load_next(self): try: url = next(self._urls) except StopIteration: return False else: self.load(QUrl(url)) return True def process_current_page(self, html): self.htmlReady.emit(html, self.url().toString()) if not self.load_next(): QApplication.instance().quit() def handleLoadFinished(self): self.toHtml(self.process_current_page) def javaScriptConsoleMessage(self, *args, **kwargs): if self._verbose: super().javaScriptConsoleMessage(*args, **kwargs)</code>
Usage:
<code class="python">import sys from PyQt5.QtWidgets import QApplication app = QApplication(sys.argv) webpage = WebPage(verbose=False) webpage.htmlReady.connect(my_html_processor) urls = ['https://en.wikipedia.org/wiki/Special:Random'] * 3 webpage.load_urls(urls) sys.exit(app.exec_())</code>
この改善された実装を利用することで、クラッシュすることなく複数の Web ページを確実にスクレイピングできるようになりました。
以上が以下に、重要な問題と解決策に焦点を当てた、記事の内容に適した質問ベースのタイトルをいくつか示します。 * **Qt の QWebPage で複数のページをスクレイピングするとクラッシュが発生するのはなぜですか?** * **どうやっての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。