Утечка памяти: веб-очистка элемента javascript с веб-страницы с помощью PyQt4 (перезагрузка той же веб-страницы в l oop) - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь избавиться от утечки памяти в этом скрипте python 3, который выполняет следующее, несколько раз (35 раз).

  1. Посещает URL http://quotes.toscrape.com/js/, используя PyQt4 для загрузки элементов страницы dynamici c javascript и захвата источника страницы.

  2. Анализирует источник страницы с помощью Beautiful Soup 4, а затем печатает текст первого тега span (т. е. первой цитаты на этой веб-странице) и ждет 1 секунду, прежде чем повторить l oop.

Код работает так, как ожидается кроме того, что я заметил, что это утечка памяти с каждой итерацией l oop. Я подозреваю, что что-то в PyQt виновато, или, скорее, мое плохое обращение с этим, но после того, как два дня ударился головой о стену, я подумал, что может быть лучше попросить о помощи здесь.

I Я попытался с помощью Memory Profiler отследить виновника, и я подозреваю, что проблема в том, что self.app.exec_ () не закрывается должным образом.

Я пытался добавить QApplication.exec_() или QApplication.quit() через некоторое время l oop, но ни один из них не помог.

Я также пытался del QApplication безрезультатно.

Я также пытался добавить QApplication.exec_ () через некоторое время l oop, но это не помогло

Из моего исследования я понимаю, что PyQt имеет свою собственную форму сборки мусора (см. здесь: https://machinekoder.com/how-to-not-shoot-yourself-in-the-foot-using-python-qt/).

Чтение здесь http://python.6.x6.nabble.com/Hunting-down-memory-leaks-td1792250.html кажется, что может быть еще живая ссылка на объект PyQt, который мешает освобождению памяти сборщиком мусора.

Я новичок в Python. Любое руководство или совет будет высоко ценится! Спасибо.

import sys
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QUrl
from PyQt4.QtWebKit import QWebPage
import bs4 as bs
import time

app = QApplication(sys.argv)

#This class loads webpage with PyQt4 making it possible to scrape the javascipt elements
class Client(QWebPage): 

    def __init__(self, url):
        self.app = QApplication.instance()
        QWebPage.__init__(self)
        self.loadFinished.connect(self.on_page_load)
        self.mainFrame().load(QUrl(url))
        self.app.exec_()

    def on_page_load(self):
        self.app.quit()


i = 0
while i < 36:
    url = 'http://quotes.toscrape.com/js/'
    client_response = Client(url)
    source = client_response.mainFrame().toHtml()
    soup = bs.BeautifulSoup (source, 'html.parser') #this parses the page source
    print(i, soup.span.text) #prints the text of the first span class (i.e. the first quote on the web page. 
    i += 1
    time.sleep(1)
...