【Python爬虫课程设计】大数据分析——东方财富石头科技股市数据分析

发布时间 2023-12-31 20:32:28作者: 高文zz

一、选题课程背景

在当今信息化时代,数据已成为驱动各行各业发展的重要力量。股市作为经济的晴雨表,其数据更是备受关注。东方财富网作为国内知名的财经网站,拥有海量的股市数据。随着大数据技术的不断发展,数据在各行各业的应用越来越广泛。股市作为经济的核心,其数据的价值不言而喻。然而,获取股市数据并非易事,尤其是对于普通投资者而言。

二、选题意义

股市数据分析对于金融领域的研究具有重要意义。东方财富网作为中国的主要财经网站,其数据具有很高的研究价值。通过爬取和分析这些数据,可以深入了解中国股市的运行规律、投资者行为和市场趋势,为金融学、经济学和其他相关学科的研究提供实证支持。对于投资者而言,股市数据的实时性和准确性至关重要。通过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() 
    # 数据分析和数据可视化