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函数中进行简单的整合,即可成功运行了。
实验效果