Как поместить в цикл код с применнием ООП
Есть код который получает html код страницы сайта для дальнейшего парсинга этого кода.
Мне нужно получать код с этого сайта примерно каждые 15 секунд для того чтобы быстро узнать о появлении чего либо на сайте.
Мне его нужно поместить в цикл, то есть чтобы в цикле снова загружалась таже страница load(Qurl(url)) и я получал ее html код
Код:
from PyQt5.QtWebEngineWidgets import QWebEnginePage
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
import sys
url = 'https://www.google.com'
class Page(QWebEnginePage):
def __init__(self, url):
self.app = QApplication(sys.argv)
QWebEnginePage.__init__(self)
self.html = ''
self.loadFinished.connect(self._on_load_finished)
self.load(QUrl(url))
self.app.exec_()
def _on_load_finished(self):
self.html = self.toHtml(self.Callable)
def Callable(self, html_str):
self.html = html_str
self.app.quit()
html = Page(url).html
Если сделать так:
from PyQt5.QtWebEngineWidgets import QWebEnginePage
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
import sys
url = 'https://www.google.com'
class Page(QWebEnginePage):
def __init__(self, url):
self.app = QApplication(sys.argv)
QWebEnginePage.__init__(self)
self.html = ''
self.loadFinished.connect(self._on_load_finished)
self.load(QUrl(url))
self.app.exec_()
def _on_load_finished(self):
self.html = self.toHtml(self.Callable)
def Callable(self, html_str):
self.html = html_str
self.app.quit()
while 1:
html = Page(url).html
print(html)
То тогда после первой итерации цикла while код завершит свое выполнение с вот таким сообщением:
Process finished with exit code -1073741819 (0xC0000005)
Нет selenium мне не походит из за большого потребления ресурсов.
Я знаю о существовании requests, я его не использую из-за того что мне требуется чтобы на странице выполнялся javascript.
Сайт google.com взят как пример.
Код выше взят тут
Ответы (1 шт):
Нельзя использовать в основном потоке циклы - это блокирует интерфейс.
В данном случае думаю QTimer вам подойдет.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWebEngineWidgets import QWebEnginePage
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
class Page(QWebEnginePage):
def __init__(self, parent=None):
QWebEnginePage.__init__(self)
self.parent = parent
self.html = ''
self.loadFinished.connect(self._on_load_finished)
def _on_load_started(self, url):
#print(f'_on_load_started(self, url): {url}')
self.load(QUrl(url))
def _on_load_finished(self):
#print(f'_on_load_finished')
self.html = self.toHtml(self.Callable)
def Callable(self, html_str):
self.html = html_str
self.parent.textEdit.setText(self.html)
#print(f'Callable(self, html_str):...')
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.centralwidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralwidget)
url = 'https://ru.stackoverflow.com/'
self.textEdit = QtWidgets.QTextEdit()
self.lineEdit = QtWidgets.QLineEdit(url)
self.spinBox = QtWidgets.QSpinBox()
self.spinBox.setMinimum(15 * 1000)
self.spinBox.setMaximum(60 * 1000 * 5)
self.spinBox.setSuffix(" -> msec ")
self.spinBox.valueChanged.connect(self.value_changed)
self.button = QtWidgets.QPushButton("Start")
self.button.clicked.connect(self.on_clicked)
self.layout = QtWidgets.QGridLayout(self.centralwidget)
self.layout.addWidget(self.textEdit, 0, 0, 1, 3)
self.layout.addWidget(self.lineEdit, 1, 0)
self.layout.addWidget(self.spinBox, 1, 1)
self.layout.addWidget(self.button, 1, 2)
self.page = Page(self)
self.timer = QtCore.QTimer()
self.timer.setInterval(self.spinBox.value())
self.timer.timeout.connect(self.showTime)
def on_clicked(self):
if self.button.text() == "Start":
self.timer.start()
self.button.setText("Stop")
else:
self.timer.stop()
self.button.setText("Start")
@QtCore.pyqtSlot(int)
def value_changed(self, new_value):
self.timer.setInterval(new_value)
def showTime(self):
self.page._on_load_started(self.lineEdit.text())
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(400, 300)
w.show()
sys.exit(app.exec_())
Update
Мне не требуется интерфейс Все что мне нужно это получать
htmlкод сайта каждые15секунд.
Почувствуйте разницу
import sys
from PyQt5.QtWebEngineWidgets import QWebEnginePage
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl, QTimer
url = 'https://www.google.com'
class Page(QWebEnginePage):
def __init__(self, url):
self.app = QApplication(sys.argv)
QWebEnginePage.__init__(self)
self.url = url
self.html = ''
self.loadFinished.connect(self._on_load_finished)
self._load_url() # +++
self.app.exec_()
def _load_url(self): # +++
self.load(QUrl(self.url))
# self.app.exec_()
def _on_load_finished(self):
self.html = self.toHtml(self.Callable)
def Callable(self, html_str):
self.html = html_str
print(self.html) # +++
QTimer.singleShot(15 * 1000, self._load_url) # +++
# self.app.quit()
#html = Page(url).html
html = Page(url) # +++
