股票1.0版
【gupiao_main.py】
主函数
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow,QTableWidgetItem
import gupiao
import requests
import time
from bs4 import BeautifulSoup
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36 FS"}
#存放所有数据的列表
list = []
def get_message(text, page):
soup = BeautifulSoup(text, 'lxml')
if soup.tbody.string !=None:
return 0
else:
for each in soup.tbody.find_all('tr'):
th = each.select('th')
td = each.select('td')
#爬取每一行的数据存入数组
listline = [th[0].string, td[0].string, td[1].string, td[2].string, td[3].string, th[1].contents[0].string]
list.append(listline)
#初始化表格的行和列
#不初始化运行的时候会崩掉
ui.tableWidget.setColumnCount(6)
ui.tableWidget.setRowCount(len(list))
line = 0
# 遍历每行的元素并写入
for i in list:
for j in range(6):
# print(list[i])
ui.tableWidget.setItem(line, j, QTableWidgetItem(i[j]))
line+=1
def compute(list):
arr = []
summ = 0.0
for i in list:
arr.append(i[1])
for j in arr:
summ += eval(j) #数组里的每个元素都是str类型了,所以要转为数字类型
avg = summ/len(arr)
ui.textBrowser.setText(max(arr))
ui.textBrowser_2.setText(min(arr))
ui.textBrowser_3.setText(str(avg))
# print(type(max(arr)))
# print(min(arr))
# print(avg)
def gethtml(gupiao,date,page):
url = 'https://market.finance.sina.com.cn/transHis.php?symbol=' + gupiao + '&date=' + date + '&page=' + str(page)
print(url)
try:
r = requests.get(url=url, headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
flag = get_message(r.text, page)
if flag == 0:
return 0
except Exception as result:
print("错误原因:", result)
return 0
def mainexe():
# gupiao = input("请输入你想要查询的股票(例如sz000001):")
# date = input("请输入你想要查询的日期(格式为2021-04-27):")
gupiao= ui.lineEdit.text()
date = ui.lineEdit_2.text()
for i in range(1, 100):
# 返回如果是0则说明爬取错误或者到达尾页,要跳出循环
flag = gethtml(gupiao, date, i)
# 间隔2s爬取
time.sleep(2)
if flag == 0:
break
#计算股票单价平均值最大值最小值
compute(list)
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = QMainWindow()
ui = gupiao.Ui_Form()
ui.setupUi(MainWindow)
MainWindow.show()
ui.pushButton.clicked.connect(mainexe)
sys.exit(app.exec_())
【gupiao.py】
界面函数:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'gupiao.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(629, 426)
Form.setMinimumSize(QtCore.QSize(629, 0))
self.widget = QtWidgets.QWidget(Form)
self.widget.setGeometry(QtCore.QRect(50, 10, 521, 401))
self.widget.setObjectName("widget")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.widget)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.lineEdit = QtWidgets.QLineEdit(self.widget)
self.lineEdit.setObjectName("lineEdit")
self.horizontalLayout.addWidget(self.lineEdit)
self.verticalLayout.addLayout(self.horizontalLayout)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_2 = QtWidgets.QLabel(self.widget)
self.label_2.setObjectName("label_2")
self.horizontalLayout_2.addWidget(self.label_2)
self.lineEdit_2 = QtWidgets.QLineEdit(self.widget)
self.lineEdit_2.setObjectName("lineEdit_2")
self.horizontalLayout_2.addWidget(self.lineEdit_2)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout_3.addLayout(self.verticalLayout)
self.pushButton = QtWidgets.QPushButton(self.widget)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout_3.addWidget(self.pushButton)
self.verticalLayout_2.addLayout(self.horizontalLayout_3)
self.tableWidget = QtWidgets.QTableWidget(self.widget)
self.tableWidget.setMaximumSize(QtCore.QSize(16777215, 291))
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(6)
self.tableWidget.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
self.verticalLayout_2.addWidget(self.tableWidget)
self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.label_3 = QtWidgets.QLabel(self.widget)
self.label_3.setObjectName("label_3")
self.horizontalLayout_4.addWidget(self.label_3)
self.textBrowser = QtWidgets.QTextBrowser(self.widget)
self.textBrowser.setMaximumSize(QtCore.QSize(101, 21))
self.textBrowser.setObjectName("textBrowser")
self.horizontalLayout_4.addWidget(self.textBrowser)
self.horizontalLayout_7.addLayout(self.horizontalLayout_4)
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.label_4 = QtWidgets.QLabel(self.widget)
self.label_4.setObjectName("label_4")
self.horizontalLayout_5.addWidget(self.label_4)
self.textBrowser_2 = QtWidgets.QTextBrowser(self.widget)
self.textBrowser_2.setMaximumSize(QtCore.QSize(89, 21))
self.textBrowser_2.setObjectName("textBrowser_2")
self.horizontalLayout_5.addWidget(self.textBrowser_2)
self.horizontalLayout_7.addLayout(self.horizontalLayout_5)
self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
self.horizontalLayout_6.setObjectName("horizontalLayout_6")
self.label_5 = QtWidgets.QLabel(self.widget)
self.label_5.setObjectName("label_5")
self.horizontalLayout_6.addWidget(self.label_5)
self.textBrowser_3 = QtWidgets.QTextBrowser(self.widget)
self.textBrowser_3.setMaximumSize(QtCore.QSize(99, 21))
self.textBrowser_3.setObjectName("textBrowser_3")
self.horizontalLayout_6.addWidget(self.textBrowser_3)
self.horizontalLayout_7.addLayout(self.horizontalLayout_6)
self.verticalLayout_2.addLayout(self.horizontalLayout_7)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label.setText(_translate("Form", "股票代码:"))
self.label_2.setText(_translate("Form", "日期(2021-04-20):"))
self.pushButton.setText(_translate("Form", "查询"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("Form", "成交时间"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("Form", "成交价"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("Form", "价格变动"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("Form", "成交量(手)"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("Form", "成交额(元)"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("Form", "性质"))
self.label_3.setText(_translate("Form", "最大值:"))
self.label_4.setText(_translate("Form", "最小值:"))
self.label_5.setText(_translate("Form", "平均值:"))
【效果图】
【遇到的问题】
- 与首先是与用户的交互问题。怎样把用户输入和用户点击与界面连接起来。这里可以去看官方文档或者一些博客,每个控件都有自己的一套写入和读出的方法。
- 代码运行结束窗口自动关闭了。那就是代码有问题了,导致程序崩溃,这时候要检查一下代码是否 真的 有问题。
- 求平均值窗口崩溃。刚开始求平均值以为存放在数组里面的是数值类型的,但是却是字符类型的,所以不能进行简单的相加,会出错。用eval函数把字符型的转换为数值型的就可以相加了。
- 这里求min和max比较的是字符的ascll码而不是数值的大小,结果也是对的嘻嘻
- 还有就是在程序爬取的过程中,窗口会卡死。那是因为点击爬取的代码在主线程中运行,而整个程序就只有一个主线程,所有当在爬取的过程中就不会允许用户做任何的操作,不然会导致窗口崩溃而关闭。解决方法是使用多线程。这里我的代码写的有点乱,不好使用多线程,嘻嘻。
- 界面没有自使适应。我用了layout布局,但是不知道为什么没用,再看看吧。
的,所以不能进行简单的相加,会出错。用eval函数把字符型的转换为数值型的就可以相加了。 - 这里求min和max比较的是字符的ascll码而不是数值的大小,结果也是对的嘻嘻
- 还有就是在程序爬取的过程中,窗口会卡死。那是因为点击爬取的代码在主线程中运行,而整个程序就只有一个主线程,所有当在爬取的过程中就不会允许用户做任何的操作,不然会导致窗口崩溃而关闭。解决方法是使用多线程。这里我的代码写的有点乱,不好使用多线程,嘻嘻。
- 界面没有自使适应。我用了layout布局,但是不知道为什么没用,再看看吧。