Отображение данных парсера в PyQt
Решил визуализировать парсинг фильмов с сайта imdb.com.
Нужно чтобы при нажатии на кнопку pushButton_title Отображался мой парсер.
Пробовал, но не получалось, решил оставить как есть, в надежде что тут помогут.
Прилагаю код на pyqt:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(720, 700)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 721, 55))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label_title = QtWidgets.QLabel(self.horizontalLayoutWidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.label_title.setFont(font)
self.label_title.setObjectName("label_title")
self.horizontalLayout.addWidget(self.label_title)
self.pushButton_title = QtWidgets.QPushButton(self.horizontalLayoutWidget)
self.pushButton_title.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
self.pushButton_title.setAutoDefault(False)
self.pushButton_title.setDefault(False)
self.pushButton_title.setFlat(False)
self.pushButton_title.setObjectName("pushButton_title")
self.horizontalLayout.addWidget(self.pushButton_title)
self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 60, 721, 41))
self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_film__id = QtWidgets.QLabel(self.horizontalLayoutWidget_2)
self.label_film__id.setEnabled(True)
self.label_film__id.setObjectName("label_film__id")
self.horizontalLayout_2.addWidget(self.label_film__id)
self.label_film__name = QtWidgets.QLabel(self.horizontalLayoutWidget_2)
self.label_film__name.setObjectName("label_film__name")
self.horizontalLayout_2.addWidget(self.label_film__name)
self.label_film__year = QtWidgets.QLabel(self.horizontalLayoutWidget_2)
self.label_film__year.setObjectName("label_film__year")
self.horizontalLayout_2.addWidget(self.label_film__year)
self.label_film__rating = QtWidgets.QLabel(self.horizontalLayoutWidget_2)
self.label_film__rating.setObjectName("label_film__rating")
self.horizontalLayout_2.addWidget(self.label_film__rating)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 720, 21))
self.menubar.setObjectName("menubar")
self.menuMain = QtWidgets.QMenu(self.menubar)
self.menuMain.setObjectName("menuMain")
self.menutest = QtWidgets.QMenu(self.menubar)
self.menutest.setObjectName("menutest")
MainWindow.setMenuBar(self.menubar)
self.menubar.addAction(self.menuMain.menuAction())
self.menubar.addAction(self.menutest.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Парсер GUI"))
self.label_title.setText(_translate("MainWindow", "Парсер pyqt"))
self.pushButton_title.setText(_translate("MainWindow", "Показать фильмы"))
self.label_film__id.setText(_translate("MainWindow", "film_id"))
self.label_film__name.setText(_translate("MainWindow", "film_name"))
self.label_film__year.setText(_translate("MainWindow", "film_year"))
self.label_film__rating.setText(_translate("MainWindow", "film_rating"))
self.menuMain.setTitle(_translate("MainWindow", "Main"))
self.menutest.setTitle(_translate("MainWindow", "test"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Код на парсер:
from cgitb import html
from turtle import title
import requests
from bs4 import BeautifulSoup as BS
def create_id():
i = 0
def func():
nonlocal i
i += 1
return i
return func
movie_id = create_id()
r = requests.get("https://www.imdb.com/chart/top/?ref_=nv_mv_250")
html = BS(r.content, 'html.parser')
for el in html.select(".lister-list > tr"):
movie_name = el.select('.titleColumn > a')
movie_year = el.select('.titleColumn > .secondaryInfo')
movie_point = el.select('.ratingColumn > strong')
print(str(movie_id()) + movie_name[0].text + movie_year[0].text + movie_point[0].text)
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Sorry, мне не приглянулась ваша форма, но то что вы задумали может выглядеть примерно так:
import sys
from cgitb import html
from turtle import title
import requests
from bs4 import BeautifulSoup as BS
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
def create_id():
i = 0
def func():
nonlocal i
i += 1
return i
return func
class Thread(QThread):
stepChanged = pyqtSignal(list)
def __init__(self):
super().__init__()
def run(self):
self.movie_id = create_id()
r = requests.get("https://www.imdb.com/chart/top/?ref_=nv_mv_250")
html = BS(r.content, 'html.parser')
for el in html.select(".lister-list > tr"):
movie_name = el.select('.titleColumn > a')
movie_year = el.select('.titleColumn > .secondaryInfo')
movie_point = el.select('.ratingColumn > strong')
# print(str(self.movie_id()) + movie_name[0].text + movie_year[0].text + movie_point[0].text)
self.stepChanged.emit([
str(self.movie_id()),
movie_name[0].text,
movie_year[0].text,
movie_point[0].text
])
self.msleep(100)
self.finished.emit()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.centralwidget = QtWidgets.QWidget()
self.centralwidget.setObjectName("centralwidget")
self.setCentralWidget(self.centralwidget)
self.label_title = QtWidgets.QLabel("Парсер pyqt")
self.label_title.setObjectName("label_title")
self.pushButton_title = QtWidgets.QPushButton("Start Парсер")
self.pushButton_title.clicked.connect(self.btn_clicked)
self.tableWidget = QTableWidget()
self.tableWidget.setRowCount(0)
self.tableWidget.setColumnCount(4)
self.tableWidget.setHorizontalHeaderLabels(
["film_id", "film_name", "film_year", "film_rating"])
self.tableWidget.verticalHeader().hide()
self.tableWidget.setAlternatingRowColors(True)
self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
layout = QGridLayout(self.centralwidget)
layout.addWidget(self.label_title, 0, 0, alignment=Qt.AlignCenter)
layout.addWidget(self.pushButton_title, 0, 1, alignment=Qt.AlignRight)
layout.addWidget(self.tableWidget, 2, 0, 1, 2)
self.thread = None
def btn_clicked(self):
if self.thread is None:
self.tableWidget.setRowCount(0)
self.thread = Thread()
self.thread.stepChanged.connect(self.onStepChanged)
self.thread.finished.connect(self.onFinished)
self.thread.start()
self.pushButton_title.setText("Stop thread")
else:
self.thread.terminate()
self.thread = None
self.pushButton_title.setText("Start thread")
def onStepChanged(self, data):
rowPosition = self.tableWidget.rowCount()
self.tableWidget.insertRow(rowPosition)
for i in range(4):
self.tableWidget.setItem(rowPosition, i, QtWidgets.QTableWidgetItem(data[i]))
def onFinished(self):
self.thread = None
self.pushButton_title.setText("Start thread")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())



