python 网络爬虫开发及数据的可视化

python 网络爬虫开发及数据的可视化

实验目标

开发网络爬虫在东方财富、新浪财经或者纳斯达克等财经网站上爬取一只股票的每天的开盘价,收盘价,最高价,最低价等信息,并存储在数据库中,并开发GUI应用可视化。

实验分析

第一步我们先对实验题目进行解读,通过分析,实验要求包括以下几个:
1.爬取网页数据
2.连接数据库
3.创建GUI界面
在明确了实验要求之后,第二步逐步实现,最后将几个分散的功能块进行连接。下面具体来展示一下代码的实现过程。

实验过程

1.爬取动态网页

@property
    def run(self):
        url ='https://q.stock.sohu.com/hisHq?code=cn_000063&start=20210426&end=20210526&stat=1&order=D&period=d' \
            '&callback=historySearchHandler&rt=jsonp&r=0.4393557909283363&0.18624420076740833 '
        req = urllib.request.Request(url)

        with urllib.request.urlopen(req) as response:
            data = response.read()
            htmlstr = data.decode('gbk')
            print(htmlstr)
            htmlstr = htmlstr.replace('historySearchHandler(', '')
            htmlstr = htmlstr.replace(')', '')
            print('替换后的:', htmlstr)
            list = json.loads(htmlstr)
            print(type(list))
            dic = (list[0])
            print(dic)
            print(type(dic))
            data: object = dic["hq"]
            print(data)
            return data

本次选择要爬取的股票网站是搜狐财经,经过实验发现,想要获取的历史数据是动态数据,在这种情况下想要成功获取数据,首先要做的就是借助Web工具箱,在JS界面找到对应的网址并进行复制,这就完成了网页爬取的第一步,确定了url的值。
为了方便实验后期各项功能的组合,将首个爬取功能设置为一个返回数据的函数,以便之后数据库的调用。
web工具箱获取爬取网址相关操作如下:
在这里插入图片描述
考虑到更直观的显示股票走向,不妨在实验中增设K线图,为了便于K线图读取数据,在爬取网页数据的同时就生成.csv文件存储至本地文件夹,便于在绘图时利用pandas库的read_csv函数直接读取数据。相关代码操作如下:

 def writefile(self):
        name = ['Date', 'Open', 'Close', 'RFf', 'RFm', 'Low', 'High', 'Amount', 'Total', 'Rate']
        test = pd.DataFrame(columns=name, data=data1)
        #print(test)
        test.to_csv('F:\\python\\testcsv.csv', encoding='gbk')
        ('爬取的数据已自动生成csv文件存储至F:\\python\\testcsv.csv')
        dlg = wx.MessageDialog(self, '网页数据爬取成功\n爬取的数据已自动生成csv文件存储至F:\\python\\testcsv.csv')
        dlg.ShowModal()
        dlg.Destroy()

 def stockprice(self):
        # 导入数据
        history = pd.read_csv('F:\\python\\testcsv.csv', parse_dates=True, index_col=1)
        history.index.name = 'Date'
        history.shape
        history.head(3)
        history.tail(3)
        mc = finance.make_marketcolors(up='g', down='r')
        s = finance.make_mpf_style(marketcolors=mc, rc={'font.family': 'SimHei'})
        finance.plot(history, type='candle', style=s)

2.数据保存至数据库
首先,要将获取的网页数据保存到数据库中第一步就是完成python与数据库的连接,在这里,通过导入pymysql库实现MySQL数据库的连接;其次,在完成表的连接后,再根据数据的列特征设置与其相对应的表头,以便进行数据存储与显示;最后,将获取的数据列表转化为字典形式,按行存入数据库,就完成了该项功能。

    def sql(self):
        db = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='1234', db='test_db', charset='utf8')
        cursor = db.cursor()
        # 创建stock表:
        cursor.execute(
            'create table stock (Date date,Open float,Close float,RFf float,RFm varchar(20),Low float,High float,'
            'Amount bigint,Total float,Rate varchar(20) )')
        # 插入一行记录,注意MySQL的占位符是%s:
        title = ['Date', 'Open', 'Close', 'RFf', 'RFm', 'Low', 'High', 'Amount', 'Total', 'Rate']
        for row in data1:
            rows = dict(zip(title, row))
            cursor.execute(
                'insert into stock (Date,Open,Close,RFf,RFm,Low,High,Amount,Total,Rate) values (%(Date)s,%(Open)s,'
                '%(Close)s,%(RFf)s,%(RFm)s,%(Low)s,%(High)s,%(Amount)s,%(Total)s,%(Rate)s)',
                rows)
            cursor.rowcount

        # 提交事务:
        db.commit()
        cursor.close()

        # 关闭Cursor和Connection:
        cursor.close()
        True
        db.close()
        dlg = wx.MessageDialog(self, '数据已成功存储至MySQL数据库,生成表名:stock')
        dlg.ShowModal()
        dlg.Destroy()

3.创建GUI界面
GUI界面的设置比较简略,只包括三个按钮控件,通过wxpython库进行版面设计,再通过事件绑定实现,以达到按下按钮实现不同功能选择的效果。

#GUI界面初始化函数
    def __init__(self):
        super().__init__(parent=None, title='网络爬虫', size=(300, 180))
        self.Centre()  # 设置窗口居中
        panel = wx.Panel(parent=self)
        b1 = wx.Button(parent=panel, id=10, label='爬取网页数据', pos=(100, 10))
        b2 = wx.Button(parent=panel, id=11, label='连接数据库', pos=(100, 60))
        b3 = wx.Button(parent=panel, id=12, label='生成K线图', pos=(100, 110))
        title = wx.StaticText(panel, label="主要功能:", pos=(10, 10))
        self.Bind(wx.EVT_BUTTON, self.on_click, id=10)
        self.Bind(wx.EVT_BUTTON, self.on_click, id=11)
        self.Bind(wx.EVT_BUTTON, self.on_click, id=12)
#按钮控件响应函数
    def on_click(self, event):
        event_id = event.GetId()
        if event_id == 10:
            global  data1
            data1 = self.run
            self.writefile()
            print(data1)
        if event_id == 11:
            self.sql()
        if event_id == 12:
            self.stockprice()

在完成了三个功能函数代码的编写之后,只需要在main函数中进行简单的整合,即可成功运行了。

实验效果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值