Comment éviter les plantages lors du scraping de plusieurs pages Web avec QWebPage de Qt
QWebPage de Qt peut faciliter le rendu de contenu dynamique, permettant des tâches de scraping Web. Cependant, tenter de charger plusieurs pages peut souvent entraîner des plantages, surtout si l'objet QWebPage sous-jacent n'est pas correctement géré.
Le problème du chargement répété des pages
Lorsque vous chargez plusieurs fois des pages à l'aide de la même instance de QWebPage, des problèmes inattendus peuvent survenir en raison d'une suppression incorrecte d'un objet. Pour garantir la stabilité, il est crucial de créer une seule QWebPage et d'éviter de créer plusieurs instances pour chaque URL.
Solution : Créer une QWebPage réutilisable
Pour résoudre ce problème, modifiez votre code pour utiliser un seul objet QWebPage capable de gérer plusieurs chargements d'URL. Lorsque chaque chargement est terminé, la page déclenchera une boucle interne pour récupérer l'URL suivante. Cette approche élimine le besoin de créations multiples de QApplication et de QWebPage, qui peuvent provoquer des plantages.
Exemple de code utilisant la QWebPage améliorée
Voici un exemple mis à jour qui démontre l'utilisation de une QWebPage réutilisable :
<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>
Utilisation :
<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>
En utilisant cette implémentation améliorée, vous pouvez désormais gratter plusieurs pages Web de manière fiable sans rencontrer de plantages.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!