Обновление данных по запросом парсера

    ...
    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_()) 

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка