Обновление данных по запросом парсера
...
pageURL = "http://192.168.6.11/cgi-bin/ssi?f=/scheme_content.html"
req = requests.get(pageURL)
req.encoding='utf-8'
print(req.status_code)
soup = BeautifulSoup(req.text, "html.parser")
comments = soup.findAll('b')[0]
comments1 = soup.findAll('b')[3]
comments2 = soup.findAll('b')[4]
comments3 = soup.findAll('b')[6]
#print(comments.get_text())
self.textEdit2.setText(comments.get_text())
self.textEdit3.setText(comments1.get_text())
self.textEdit4.setText(comments2.get_text())
self.textEdit5.setText(comments3.get_text())
...
Как сделать чтобы значения периодически обновлялись, то есть процесс парсер раз в 10 секунд заново брал данные и выводил в текстбоксы.
Думаю через timer() сделать, но не соображу как код поместить в метод чтобы он работал. Без метода работает, с ним текстбокс пустой.
Update:
Вот все как мне надо:
import sys # sys нужен для передачи argv в QApplication
import locale
import requests
from bs4 import BeautifulSoup
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.Qt import *
from datetime import datetime,time
import design13 # Это наш конвертированный файл дизайна
#import paho.mqtt.client as mqtt
import pprint
#import pygame
class ExampleApp(QtWidgets.QMainWindow, design13.Ui_MainWindow):
def __init__(self):
# Это здесь нужно для доступа к переменным, методам
# и т.д. в файле design.py
super().__init__()
self.setupUi(self) # Это нужно для инициализации нашего дизайна
self.text = ''
self.timer = QtCore.QTimer(self)
self.timer.setInterval(5000)
self.timer.timeout.connect(self.displayTime)
self.timer.start()
def displayTime(self):
pageURL = "https://time100.ru/Nizhny-Novgorod"
req = requests.get(pageURL)
req.encoding='utf-8'
soup = BeautifulSoup(req.text, "html.parser")
comments = soup.findAll('span')[0]
# comments1 = soup.findAll('b')[3]
# comments2 = soup.findAll('b')[4]
# comments3 = soup.findAll('b')[6]
#print(comments.get_text())
self.textEdit2.setText(comments.get_text())
# self.textEdit3.setText(comments1.get_text())
# self.textEdit4.setText(comments2.get_text())
# self.textEdit5.setText(comments3.get_text())
def main():
app = QtWidgets.QApplication(sys.argv) # Новый экземпляр QApplication
window = ExampleApp() # Создаём объект класса ExampleApp
window.show() # Показываем окно
app.exec_() # и запускаем приложение
if __name__ == '__main__': # Если мы запускаем файл напрямую, а не импортируем
main()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
В реальной жизни парсер это тяжелая задача и может заморозить интерфейс, а тяжелые задачи надо запускать в потоке. Попробуйте.
import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Thread(QThread):
stepChanged = pyqtSignal(str, str, str, str)
def __init__(self, url):
super().__init__()
self.url = url
def run(self):
while True:
''' эти 12 строк раскомментируете
req = requests.get(self.url)
req.encoding = 'utf-8'
print(req.status_code)
soup = BeautifulSoup(req.text, "html.parser")
comments = soup.findAll('b')[0]
comments1 = soup.findAll('b')[3]
comments2 = soup.findAll('b')[4]
comments3 = soup.findAll('b')[6]
comments = comments.get_text()
comments1 = comments1.get_text()
comments2 = comments2.get_text()
comments3 = comments3.get_text()
'''
# эту строку закомментируете
comments, comments1, comments2, comments3 = list(map(str, [random.randint(0, 500) for _ in range(4)]))
self.stepChanged.emit(comments, comments1, comments2, comments3)
self.msleep(5000)
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
pageURL = "http://192.168.6.11/cgi-bin/ssi?f=/scheme_content.html"
self.lineEdit = QtWidgets.QLineEdit(pageURL)
self.textEdit2 = QLineEdit()
self.textEdit3 = QLineEdit()
self.textEdit4 = QLineEdit()
self.textEdit5 = QLineEdit()
self.pushButton = QPushButton('Start thread')
self.pushButton.clicked.connect(self.btn_clicked)
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.textEdit2)
layout.addWidget(self.textEdit3)
layout.addWidget(self.textEdit4)
layout.addWidget(self.textEdit5)
layout.addWidget(self.lineEdit)
layout.addWidget(self.pushButton)
self.lineEdit.setFocus()
self.thread = None
def btn_clicked(self):
url = self.lineEdit.text()
if self.thread is None:
self.thread = Thread(url)
self.thread.stepChanged.connect(self.onStepChanged)
self.thread.start()
self.pushButton.setText("Stop thread")
else:
self.thread.terminate()
self.thread = None
self.pushButton.setText("Start thread")
def onStepChanged(self, comments, comments1, comments2, comments3):
self.textEdit2.setText(comments)
self.textEdit3.setText(comments1)
self.textEdit4.setText(comments2)
self.textEdit5.setText(comments3)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MainWindow()
w.resize(400, 200)
w.show()
sys.exit(app.exec_())


