pyqt.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import sys, json, time
  2. from pathlib import Path
  3. # from PyQt5.QtWidgets import (
  4. from PyQt6.QtWidgets import (
  5. QApplication, QWidget, QVBoxLayout, QHBoxLayout,
  6. QTextEdit, QPushButton, QLabel, QMessageBox
  7. )
  8. from PyQt6.QtCore import Qt, QThread, pyqtSignal
  9. # from PyQt5.QtCore import Qt, QThread, pyqtSignal
  10. # 引入你现有的函数
  11. from req import build_driver, scrape_item, save_to_excel, EXCEL_PATH
  12. class Worker(QThread):
  13. log = pyqtSignal(str)
  14. done = pyqtSignal()
  15. def __init__(self, urls):
  16. super().__init__()
  17. self.urls = urls
  18. def run(self):
  19. driver = build_driver()
  20. results = []
  21. try:
  22. for url in self.urls:
  23. if not url.strip():
  24. continue
  25. self.log.emit(f"开始抓取: {url}")
  26. info = scrape_item(driver, url.strip())
  27. results.append(info)
  28. self.log.emit(json.dumps(info, ensure_ascii=False))
  29. time.sleep(1.0)
  30. if results:
  31. save_to_excel(EXCEL_PATH, results)
  32. self.log.emit(f"写入完成:{EXCEL_PATH}")
  33. except Exception as e:
  34. self.log.emit(f"出错: {e}")
  35. finally:
  36. driver.quit()
  37. self.done.emit()
  38. class App(QWidget):
  39. def __init__(self):
  40. super().__init__()
  41. self.setWindowTitle("1688抓取")
  42. self.resize(800, 600)
  43. self.input = QTextEdit()
  44. self.input.setPlaceholderText("每行一个商品链接")
  45. self.log = QTextEdit()
  46. self.log.setReadOnly(True)
  47. self.btn = QPushButton("开始抓取")
  48. self.btn.clicked.connect(self.start)
  49. layout = QVBoxLayout()
  50. layout.addWidget(QLabel("商品链接:"))
  51. layout.addWidget(self.input, 3)
  52. layout.addWidget(self.btn)
  53. layout.addWidget(QLabel("日志:"))
  54. layout.addWidget(self.log, 4)
  55. self.setLayout(layout)
  56. self.worker = None
  57. def start(self):
  58. urls = [u for u in self.input.toPlainText().splitlines() if u.strip()]
  59. if not urls:
  60. QMessageBox.warning(self, "提示", "请先输入链接")
  61. return
  62. self.btn.setEnabled(False)
  63. self.worker = Worker(urls)
  64. self.worker.log.connect(self.append_log)
  65. self.worker.done.connect(self.finish)
  66. self.worker.start()
  67. def append_log(self, text):
  68. self.log.append(text)
  69. def finish(self):
  70. self.btn.setEnabled(True)
  71. self.log.append("任务完成")
  72. if __name__ == "__main__":
  73. app = QApplication(sys.argv)
  74. w = App()
  75. w.show()
  76. sys.exit(app.exec())
  77. # sys.exit(app.exec_())