【Python爬虫课程设计】大数据分析——东方财富石头科技股市数据分析
一、选题课程背景
在当今信息化时代,数据已成为驱动各行各业发展的重要力量。股市作为经济的晴雨表,其数据更是备受关注。东方财富网作为国内知名的财经网站,拥有海量的股市数据。随着大数据技术的不断发展,数据在各行各业的应用越来越广泛。股市作为经济的核心,其数据的价值不言而喻。然而,获取股市数据并非易事,尤其是对于普通投资者而言。
二、选题意义
股市数据分析对于金融领域的研究具有重要意义。东方财富网作为中国的主要财经网站,其数据具有很高的研究价值。通过爬取和分析这些数据,可以深入了解中国股市的运行规律、投资者行为和市场趋势,为金融学、经济学和其他相关学科的研究提供实证支持。对于投资者而言,股市数据的实时性和准确性至关重要。通过Python爬虫技术,投资者可以快速、准确地获取东方财富网上的股市数据,为投资决策提供实时依据。这有助于提高投资者的盈利能力,推动资本市场的健康发展。
三、数据集简介
此数据集爬取的是东方财富网中的石头科技("https://data.eastmoney.com/zjlx/688169.html")这些数据可以帮助我们对股票数据的分析,投资者可以了解市场趋势,发现潜在的投资机会,并制定相应的投资策略。这有助于提高投资决策的科学性和准确性。 通过爬取和分析股票数据,投资者可以建立有效的数据模型,预测未来的市场走势。这对于制定长期投资策略和风险管理至关重要。
日期:该支股票的某段时间数据
收盘价:某种证券在证券交易所每个交易日里的最后一笔买卖成交价格
涨跌幅:当前交易日最新成交价与前一交易日收盘价相比较所产生的数值
主力净流入 净额:主力资金流入和主力资金流出的差额
主力净流入 净占比:主力资金净流入占当日成交额的比例
超大单净流入 净额:超大单资金流入和超大单资金流出的差额
超大单净流入 净占比:超大单交易量在总交易量中的占比
大单净流入 净额:大单资金流入和流出之间的差额
大单净流入 净占比:大单净流入净额占总成交额的比重
中单净流入 净额:中单资金流入和流出之间的差额
中单净流入 净占比:中单净流入净额占总成交额的比重
小单净流入 净额:小单资金流入和流出之间的差额
小单净流入 净占比:小单净流入净额占总成交额的比重
数据截图:
四、大数据分析
第三方库:
import re import json import xlwt import requests import pandas as pd import matplotlib.pyplot as plt import warnings import numpy as np from matplotlib import ticker
获取石头科技该支股票的历史资金流向抓取
url = 'https://push2his.eastmoney.com/api/qt/stock/fflow/daykline/get?cb=jQuery112309385401632211825_1687151973274&lmt=0&klt=101&fields1=f1%2Cf2%2Cf3%2Cf7&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61%2Cf62%2Cf63%2Cf64%2Cf65&ut=b2884a393a59ad64002292a3e90d46a5&secid=1.688169&_=1687151973275' headers = { 'Cookie': 'qgqp_b_id=2d4ae291b926e17cb89d32735d112a92; HAList=ty-1-688169-%u77F3%u5934%u79D1%u6280%2Cty-1-000001-%u4E0A%u8BC1%u6307%u6570; qquestionnairebox=1; st_si=52215254809151; st_pvi=33017602277084; st_sp=2023-06-05%2020%3A23%3A59; st_inirUrl=https%3A%2F%2Fcn.bing.com%2F; st_sn=1; st_psi=20230619131918296-113300300815-0420864737; st_asi=delete', 'Host': 'push2his.eastmoney.com', 'Referer': 'https://data.eastmoney.com/zjlx/688169.html', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44' } resp = requests.get(url, headers=headers) response = resp.text new_res_list = re.findall(r'data":{.*?}', response) new_res = new_res_list[0] q = re.findall(r'{.*?}', new_res) new_r_1 = str(new_res).replace('data":', '') new_r = new_r_1.strip() # print(qq) a = json.loads(new_r) # print(a) count = 0
con = ['日期', '收盘价', '涨跌幅', '主力净流入 净额', '主力净流入 净占比', '超大单净流入 净额', '超大单净流入 净占比', '大单净流入 净额', '大单净流入 净占比', '中单净流入 净额', '中单净流入 净占比', '小单净流入 净额', '小单净流入 净占比'] book = xlwt.Workbook() # 新建工作簿 table = book.add_sheet('Over', cell_overwrite_ok=True) # 如果对同一单元格重复操作会发生overwrite Exception,cell_overwrite_ok为可覆盖 for k in range(0, len(con)): table.write(0, k, con[k]) # 行,列,属性值 (1,1)为B2元素,从0开始计数
将抓取提取到的数据值写入表中
for data in a['klines']: data_p_1 = str(data) data_p = data_p_1.split(',') print(data_p) count += 1 # print(count) # sleep(0.5) for k in range(0, len(con)): table.write(count, k, data_p[k]) style = xlwt.XFStyle() # 新建样式 font = xlwt.Font() # 新建字体 font.name = 'Times New Roman' font.bold = True style.font = font # 将style的字体设置为font book.save(filename_or_stream='东方财富网.xls')
数据可视化
收盘价
提取数据库中的两列数据,一个是名为'收盘价'的股价数据,另一个是名为'日期'的时间数据函数绘制折线图,横轴为日期,纵轴为收盘价,颜色为蓝色,添加了标签'股价'。绘制出折线图
def get_data(): # 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['收盘价'] spj_list = list(i_df) r_df = df['日期'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='b', label='股价') # 绘制时间和收盘价的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("收盘价折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df)
半年主力净流入净额
提取和计算半年内某股票主力净流入净额的最大和最小日期,并打印相应的结果
# 计算半年涨跌幅最大和最小的日期 df['日期'] = pd.to_datetime(df['日期']) q1 = df['日期'] >= '2023/1/18' df_1 = df.loc[q1] q2 = df_1['主力净流入 净额'] q2_list = list(q2) vmax = max(q2_list) q3 = df_1['主力净流入 净额'] q3_list = list(q3) vmin = min(q3_list) df_2 = df_1.loc[df_1['主力净流入 净额'] == vmax].reset_index() df_3 = df_1.loc[df_1['主力净流入 净额'] == vmin].reset_index() df_2 = pd.DataFrame(df_2, columns=['日期', '主力净流入 净额']) df_2 = df_2.values.tolist()[0] df_3 = pd.DataFrame(df_3, columns=['日期', '主力净流入 净额']) df_3 = df_3.values.tolist()[0] print(df_2) print('=' * 60) print('主力净流入 净额最高的日期是{},主力净流入 净额是{}'.format(df_2[0], df_2[1])) print('主力净流入 净额最低的日期是{},主力净流入 净额是{}\n'.format(df_3[0], df_3[1]))
每月收盘价进行均值
提取库中的日期和收盘价两列使用resample按月对数据进行重采样,计算每月收盘价的均值,最后重新设置索引为默认值,打印出图形
# 计算每月收盘价的均值,并绘制柱状图 data = pd.DataFrame(df, columns=['日期', '收盘价']) data['日期'] = pd.to_datetime(data['日期']) data = data.set_index('日期') # print(data.resample('w').sum()) # print(data.resample('m').mean()) # print(data.resample('Q').sum()) # print(data.resample('AS').sum()) data = data.resample('m').mean().reset_index() print('=' * 60) print('每月收盘价的均值是:') print(data) plt.bar(list(data['日期']), list(data['收盘价']), width=12, color= 'red', label='收盘价') plt.legend() plt.savefig("月均值柱状图.png", dpi=660) plt.show() # 绘制主力净流入 净额折线图 plt.plot(list(df['日期']), list(df['主力净流入 净额']), color='b', label='主力净流入 净额') # 绘制时间和主力净流入 净额的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("主力净流入 净额折线图.png", dpi=660, bbox_inches='tight') plt.show() # print(df)
主力净流入净额
绘制主力净流入净额的折线图,横轴为日期,纵轴为主力净流入净额,颜色为蓝色,添加了标签'主力净流入净额。设置横轴主刻度为每120天一个刻度。通过绘制折线图,展示主力净流入净额随时间的变化趋势
# 绘制主力净流入 净额折线图 plt.plot(list(df['日期']), list(df['主力净流入 净额']), color='b', label='主力净流入 净额') # 绘制时间和主力净流入 净额的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("主力净流入 净额折线图.png", dpi=660, bbox_inches='tight') plt.show() # print(df)
涨跌幅
读取数据表中的涨跌幅,对涨跌幅的数据绘制出折线图
# 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['涨跌幅'] spj_list = list(i_df) r_df = df['日期'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='r', label='涨跌幅') # 绘制时间和涨跌幅的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("涨跌幅折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df)
超大单净流入净额和净占比
将数据表中获取的日期和超大单净流入净额和经进行绘制折线图
# 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['超大单净流入 净额'] spj_list = list(i_df) r_df = df['日期'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='b', label='超大单净流入 净额') # 绘制时间和超大单净流入 净额的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("超大单净流入 净额折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df) # 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['超大单净流入 净占比'] spj_list = list(i_df) r_df = df['日期'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='b', label='超大单净流入 净占比') # 绘制时间和超大单净流入 净占比的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("超大单净流入 净占比折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df)
总结
在实际项目中,我成功地编写了爬虫代码,从东方财富网等数据源中爬取了所需的股票信息。我深刻理解了反爬虫策略的重要性,并学会了如何处理异常情况和绕过限制。 爬取到的原始数据常常存在一些问题,如缺失值、异常值等。通过之前第一次上课实践学习使的用pandas进行数据清洗和整理,我成功地将原始数据转化为可用于分析的格式,提高了数据的质量。
虽然这次做的很烂,有少许部分借鉴,但是受益匪浅,通过自己的实践一步步进步,一步步的运行出自己想要的代码后非常兴奋。一分耕耘一分收获,喜欢自己能保持初心保持对这个行业充满热情的状态!!!
完整代码如下
import re import json import xlwt import requests import pandas as pd import matplotlib.pyplot as plt import warnings import numpy as np from matplotlib import ticker warnings.filterwarnings('ignore') plt.rcParams['figure.figsize'] = (14, 7.5) # 全局设置输出图片大小 1400 x 750 像素 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False con = ['日期', '收盘价', '涨跌幅', '主力净流入 净额', '主力净流入 净占比', '超大单净流入 净额', '超大单净流入 净占比', '大单净流入 净额', '大单净流入 净占比', '中单净流入 净额', '中单净流入 净占比', '小单净流入 净额', '小单净流入 净占比'] book = xlwt.Workbook() # 新建工作簿 table = book.add_sheet('Over', cell_overwrite_ok=True) # 如果对同一单元格重复操作会发生overwrite Exception,cell_overwrite_ok为可覆盖 for k in range(0, len(con)): table.write(0, k, con[k]) # 行,列,属性值 (1,1)为B2元素,从0开始计数 style = xlwt.XFStyle() # 新建样式 font = xlwt.Font() # 新建字体 font.name = 'Times New Roman' font.bold = True style.font = font # 将style的字体设置为font # table.write(0, 0, 'Test', style) book.save(filename_or_stream='东方财富网.xls') # 一定要保存 url = 'https://push2his.eastmoney.com/api/qt/stock/fflow/daykline/get?cb=jQuery112309385401632211825_1687151973274&lmt=0&klt=101&fields1=f1%2Cf2%2Cf3%2Cf7&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61%2Cf62%2Cf63%2Cf64%2Cf65&ut=b2884a393a59ad64002292a3e90d46a5&secid=1.688169&_=1687151973275' headers = { 'Cookie': 'qgqp_b_id=2d4ae291b926e17cb89d32735d112a92; HAList=ty-1-688169-%u77F3%u5934%u79D1%u6280%2Cty-1-000001-%u4E0A%u8BC1%u6307%u6570; qquestionnairebox=1; st_si=52215254809151; st_pvi=33017602277084; st_sp=2023-06-05%2020%3A23%3A59; st_inirUrl=https%3A%2F%2Fcn.bing.com%2F; st_sn=1; st_psi=20230619131918296-113300300815-0420864737; st_asi=delete', 'Host': 'push2his.eastmoney.com', 'Referer': 'https://data.eastmoney.com/zjlx/688169.html', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44' } resp = requests.get(url, headers=headers) response = resp.text new_res_list = re.findall(r'data":{.*?}', response) new_res = new_res_list[0] q = re.findall(r'{.*?}', new_res) new_r_1 = str(new_res).replace('data":', '') new_r = new_r_1.strip() # print(qq) a = json.loads(new_r) # print(a) count = 0 for data in a['klines']: data_p_1 = str(data) data_p = data_p_1.split(',') print(data_p) count += 1 # print(count) # sleep(0.5) for k in range(0, len(con)): table.write(count, k, data_p[k]) style = xlwt.XFStyle() # 新建样式 font = xlwt.Font() # 新建字体 font.name = 'Times New Roman' font.bold = True style.font = font # 将style的字体设置为font book.save(filename_or_stream='东方财富网.xls') # 一定要保存 # matplotlib def get_data(): # 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['收盘价'] spj_list = list(i_df) r_df = df['日期'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='b', label='股价') # 绘制时间和收盘价的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("收盘价折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df) # 计算半年涨跌幅最大和最小的日期 df['日期'] = pd.to_datetime(df['日期']) q1 = df['日期'] >= '2023/1/18' df_1 = df.loc[q1] q2 = df_1['主力净流入 净额'] q2_list = list(q2) vmax = max(q2_list) q3 = df_1['主力净流入 净额'] q3_list = list(q3) vmin = min(q3_list) df_2 = df_1.loc[df_1['主力净流入 净额'] == vmax].reset_index() df_3 = df_1.loc[df_1['主力净流入 净额'] == vmin].reset_index() df_2 = pd.DataFrame(df_2, columns=['日期', '主力净流入 净额']) df_2 = df_2.values.tolist()[0] df_3 = pd.DataFrame(df_3, columns=['日期', '主力净流入 净额']) df_3 = df_3.values.tolist()[0] print(df_2) print('=' * 60) print('主力净流入 净额最高的日期是{},主力净流入 净额是{}'.format(df_2[0], df_2[1])) print('主力净流入 净额最低的日期是{},主力净流入 净额是{}\n'.format(df_3[0], df_3[1])) # 计算每月收盘价的均值,并绘制柱状图 data = pd.DataFrame(df, columns=['日期', '收盘价']) data['日期'] = pd.to_datetime(data['日期']) data = data.set_index('日期') # print(data.resample('w').sum()) # print(data.resample('m').mean()) # print(data.resample('Q').sum()) # print(data.resample('AS').sum()) data = data.resample('m').mean().reset_index() print('=' * 60) print('每月收盘价的均值是:') print(data) plt.bar(list(data['日期']), list(data['收盘价']), width=12, color= 'red', label='收盘价') plt.legend() plt.savefig("月均值柱状图.png", dpi=660) plt.show() # 绘制主力净流入 净额折线图 plt.plot(list(df['日期']), list(df['主力净流入 净额']), color='b', label='主力净流入 净额') # 绘制时间和主力净流入 净额的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("主力净流入 净额折线图.png", dpi=660, bbox_inches='tight') plt.show() # print(df) # 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['涨跌幅'] spj_list = list(i_df) r_df = df['日期'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='r', label='涨跌幅') # 绘制时间和涨跌幅的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("涨跌幅折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df) # 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['主力净流入 净额'] spj_list = list(i_df) r_df = df['日期'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='b', label='主力净流入 净额') # 绘制时间和主力净流入 净额的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("主力净流入 净额折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df) # 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['超大单净流入 净额'] spj_list = list(i_df) r_df = df['日期'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='b', label='超大单净流入 净额') # 绘制时间和超大单净流入 净额的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("超大单净流入 净额折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df) # 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['超大单净流入 净占比'] spj_list = list(i_df) r_df = df['日期'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='b', label='超大单净流入 净占比') # 绘制时间和超大单净流入 净占比的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("超大单净流入 净占比折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df) # 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['大单净流入 净额'] spj_list = list(i_df) r_df = df['日期'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='b', label='大单净流入 净额') # 绘制时间和大单净流入 净额的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("大单净流入 净额折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df) #柱状图 plt.bar(list(df['日期']), list(df['涨跌幅']), width=12, color= 'red', label='涨跌幅') plt.legend() plt.savefig("涨跌幅-时间柱状图.png", dpi=660) plt.show() # 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['收盘价'] spj_list = list(i_df) r_df = df['涨跌幅'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='r', label='涨跌幅') # 绘制时间和大单净流入 净额的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("收盘价-涨跌幅折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df) # 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['收盘价'] spj_list = list(i_df) r_df = df['涨跌幅'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='b', label='涨跌幅') # 绘制时间和大单净流入 净额的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("收盘价-涨跌幅折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df) # 绘制折线图 df = pd.read_excel('东方财富网.xls') i_df = df['收盘价'] spj_list = list(i_df) r_df = df['超大单净流入 净占比'] rq_list = list(r_df) plt.plot(rq_list, spj_list, color='b', label='超大单净流入 净占比') # 绘制收盘价和超大单净流入 净占比的折线图 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120)) plt.legend() plt.savefig("收盘价-超大单净流入 净占比折线图.png", dpi=660, bbox_inches='tight') plt.show() print(df) if __name__ == '__main__': get_data() # 数据分析和数据可视化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!