爬取新浪网股票并实现界面化1.0(pyqt5)

股票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", "平均值:"))

【效果图】

image-20211018213120219

【遇到的问题】

  • 与首先是与用户的交互问题。怎样把用户输入和用户点击与界面连接起来。这里可以去看官方文档或者一些博客,每个控件都有自己的一套写入和读出的方法。
  • 代码运行结束窗口自动关闭了。那就是代码有问题了,导致程序崩溃,这时候要检查一下代码是否 真的 有问题。
  • 求平均值窗口崩溃。刚开始求平均值以为存放在数组里面的是数值类型的,但是却是字符类型的,所以不能进行简单的相加,会出错。用eval函数把字符型的转换为数值型的就可以相加了。
  • 这里求min和max比较的是字符的ascll码而不是数值的大小,结果也是对的嘻嘻
  • 还有就是在程序爬取的过程中,窗口会卡死。那是因为点击爬取的代码在主线程中运行,而整个程序就只有一个主线程,所有当在爬取的过程中就不会允许用户做任何的操作,不然会导致窗口崩溃而关闭。解决方法是使用多线程。这里我的代码写的有点乱,不好使用多线程,嘻嘻。
  • 界面没有自使适应。我用了layout布局,但是不知道为什么没用,再看看吧。
    的,所以不能进行简单的相加,会出错。用eval函数把字符型的转换为数值型的就可以相加了。
  • 这里求min和max比较的是字符的ascll码而不是数值的大小,结果也是对的嘻嘻
  • 还有就是在程序爬取的过程中,窗口会卡死。那是因为点击爬取的代码在主线程中运行,而整个程序就只有一个主线程,所有当在爬取的过程中就不会允许用户做任何的操作,不然会导致窗口崩溃而关闭。解决方法是使用多线程。这里我的代码写的有点乱,不好使用多线程,嘻嘻。
  • 界面没有自使适应。我用了layout布局,但是不知道为什么没用,再看看吧。

猜你喜欢

转载自blog.csdn.net/weixin_48931875/article/details/121301627