PyQt5 GUI + Simple Parser
Пытаюсь написать простой парсер на BeatifulSoup и подключить к нему Gui на PyQt5. Парсер готов, и все работает как надо, а вот с Gui никак не могу разобраться. Конкретно проблема в связке parser.py и gui.py. (я новичок, поэтому прошу не ругаться за кривой код) Вот код парсера :
from selenium import webdriver
import time
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('headless')
browser = webdriver.Chrome(chrome_options=options)
def main():
i=0
kl = 0
n = input('Нужна ссылка? +/- ')
j = int(input('Сколько страниц отобразить? '))
baseurl = input('Введите ссылку ')
while i <= j-1:
i = i+1
p = '#p'
pop = '_popular_desc'
for kl in range(j):
kl = kl +1
prime = p+str(kl)+pop
url = baseurl + prime
browser.get(url)
time.sleep(0.8)
requiredHtml = browser.page_source
soup = BeautifulSoup(requiredHtml, 'html.parser')
items = soup.find_all('a' , class_='market_listing_row_link')
lots = []
print (' ')
for item in items:
lot1 = item.find('span',class_='market_listing_item_name').text,item.find('span',
class_="market_table_value normal_price").find_next('span' ,
class_='normal_price').text,item.find('div',class_='market_listing_row market_recent_listing_row
market_listing_searchresult').find_previous('a',class_='market_listing_row_link').get('href')
lot2 = item.find('span',class_='market_listing_item_name').text,item.find('span',
class_="market_table_value normal_price").find_next('span' , class_='normal_price').text
if n == '+':
print(lot1)
elif n == '-':
print(lot2)
else:
print('Парсинг окончен')
def proxy():
pr = input('Хотите использовать прокси? +/- ')
if pr == '-':
main()
elif pr == '+':
PROXY = input('Введите Прокси ')
options.add_argument('--proxy-server=%s' % PROXY)
main()
proxy()
input('Введите Enter для выхода ')
А вот gui.py
from PyQt5 import QtWidgets
from parseui import Ui_MainWindow # импорт нашего сгенерированного файла
import sys
import parser
class mywindow(QtWidgets.QMainWindow):
def __init__(self):
super(mywindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.ButClick)
def ButClick(self):
parser.main()
app = QtWidgets.QApplication([])
application = mywindow()
application.show()
sys.exit(app.exec())
В parser.py Есть переменные (n , j , baseurl) Их я хотел бы вводить через графический интерфейс( lineEdit,lineEdit_2 и т.д) но как это сделать не понимаю, ведь в gui.py есть import parser, а значит в parser я уже не смогу прописать import gui.
Ответы (2 шт):
В простых случаях. Вернул
def main(n , j , baseurl):
....
lots = []
for item in items:
...
lots.append(lot)
return lots
Принял
def ButClick(self):
n =
j = ...
baseurl = self.ui.lineEdit.text()
lots = parser.main(n , j , baseurl)
textArea.setText(str(lots))
Но если надо каждую итерацию их обновлять, то нужно передать колбэк функцию
в parser.py
def main(cb, n , j , baseurl):
....
while ...
for ....
for ....
cb(lot)
... в gui.py
def ButClick(self):
parser.main(self.Update, n , j , baseurl)
def Update(self, lot):
self.ui.textArea.appendText(lot)
QtWidgets.QApplication.processEvents()
input() убираешь, принт меняешь на cb(...)
Пару примеров для демонстрации принципа:
class mywindow(QtWidgets.QMainWindow):
...
def ButClick(self):
# Берем значение url из соответствующего компонента вашего GUI
res = parser.main( self.ui.lineEdit.text(), <другие аргументы> ) # Так передаем baseurl
self.ui.textEdit.setText(<Вывод результата парсинга>)
# Установлена ли галочка Использования прокси
parser.proxy( self.ui.checkBoxUseProxy.isChecked(), <другие аргументы> ) # Используем ли прокси
# и так далее
Теперь надо добавить соответствующие аргументы в функции и убрать из них input'ы:
def main(baseurl):
...
return lot1, lot2
def proxy(use):
if use:
...
else:
...
return ...
