【机器学习】股票数据爬取与展示分析(有代码链接)

数据爬取

  • 一、爬取原理
  • 二、代码实践
    • [2.1 股票列表获取](#2.1 股票列表获取)
    • [2.1.1 确定待爬取网页](#2.1.1 确定待爬取网页)
    • [2.1.2 向网页发送请求获取页面响应](#2.1.2 向网页发送请求获取页面响应)
    • [2.1.3 文本转换成JSON](#2.1.3 文本转换成JSON)
    • [2.1.4 将数据保存到csv文件中](#2.1.4 将数据保存到csv文件中)
    • [2.2 股票数据获取](#2.2 股票数据获取)
  • 三、结果分析

代码实现链接

一、爬取原理

本文中主要使用的就是Python的request库,这个库基于HTTP请求实现,使用步骤为如下四个:

  • 发起请求: 通过HTTP库向目标站点发起请求,等待目标站点服务器响应。
  • 获取响应: 若服务器正常响应,会返回一个Response,该Response即为获取得页面内容,Response可以是HTML、JSON字符串、二进制数据等数据类型。
  • 解析内容: 利用正则表达式、网页解析库对HTML进行解析;将json数据转为JSON对象进行解析;保存我们需要得二进制数据(图片、视频)。
  • 保存数据: 可将爬取并解析后的内容保存为文本,或存至数据库等。

二、代码实践

我们以最有趣的股票数据爬取来进行代码实践,说不定未来AI算法在股票分析领域大放异彩可以用来赚钱呢哈哈😊:

2.1 股票列表获取

2.1.1 确定待爬取网页

这里以东方财富为例,其他的都殊途同归😁

可能我们仅仅想要创业板块的数据,单独选择这个面板,然后右键鼠标选择检查页面。

在点击检查以后就会出现以下的内容,这里面的代码就是用于请求的时候要请求的内容:

这里红色框框出来的部分就是等下爬虫的时候要用到的地址api😎

2.1.2 向网页发送请求获取页面响应

python 复制代码
## 要请求的网页:http://quote.eastmoney.com/center/gridlist.html

def get_html(url):
    """
    args:
        url: 请求的网页地址
    return:
        html: 请求到的网页内容
    """

    # 请求网页, 随机生成一个User-Agent
    r = requests.get(url, headers = {'User-Agent': UserAgent().random}) 
    # 自动获取网页的编码方式
    r.encoding = r.apparent_encoding 
    # 返回网页内容
    return r.text 

# 设置请求记录数量
num = 10 
# 设置请求的网页地址
stock_url = 'http://20.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124015648513440542944_1729931309203&pn=1&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&dect=1&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:80&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1729931309454:formatted'.format(num)
# 请求网页
stock_html_text = get_html(stock_url)
# 打印请求到的网页内容
print(stock_html_text)

这里需要注意在直接复制过来的url后面需要加上一个format(num)用来限制爬取的数据数量。

2.1.3 文本转换成JSON

python 复制代码
# 将原始的文本按照括号进行分割
json_text = stock_html_text.split('(')[1].split(')')[0]
# 将json文本转换为字典
stock_dict = json.loads(json_text)
# 打印字典
print(stock_dict)
# 提取股票信息,data是一个字典,diff是一个列表
stock_list = stock_dict['data']['diff']
# 数据解析
data_list = []
# 遍历股票列表
for data in stock_list:
    row = [data["f12"], data["f14"]]
    data_list.append(row)
# 打印数据
print(data_list)

2.1.4 将数据保存到csv文件中

python 复制代码
f = open('dataset/stock.csv', 'w', encoding='utf-8', newline='')
writer = csv.writer(f)
writer.writerow(['股票代码', '股票名称'])
for data in data_list:
    writer.writerow(data)
f.close()

2.2 股票数据获取

首先需要选定一个股票数据网站:

python 复制代码
import csv
import urllib.request as r
import threading
 
#读取之前获取的个股csv丢入到一个列表中
def getStockList():
    stockList = []
    f = open('dataset/stock.csv','r',encoding='utf-8')
    f.seek(0)
    reader = csv.reader(f)
    for item in reader:
        stockList.append(item)
    f.close()
    return stockList
 
def downloadFile(url,filepath):
    # print(filepath)
    try:
        r.urlretrieve(url,filepath)
    except Exception as e:
        print(e)
    print(filepath,"is downloaded")
    pass
 
#设置信号量,控制线程并发数
sem = threading.Semaphore(1)
def downloadFileSem(url,filepath):
    with sem:
        downloadFile(url,filepath)

urlStart = 'http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol=sz'
urlEnd = '&scale=5&ma=5&datalen=1023'
 
if __name__ == '__main__':
	stockList = getStockList()
	stockList.pop(0)
	print(stockList)
	for s in stockList:
		scode = str(s[0].split("\t")[0])
		#0:沪市;1:深市
		url = urlStart + scode + urlEnd
		print(url)
		filepath = "dataset/" + (str(s[1].split("\t")[0]) + "_" + scode) + ".json"
		threading.Thread(target=downloadFileSem,args=(url,filepath)).start()

三、结果分析

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt

# 从JSON文件加载数据
file_path = 'dataset/中科电气_300035.json'
df = pd.read_json(file_path)

# 将'day'列转换为datetime类型
df['day'] = pd.to_datetime(df['day'])

# 设置'day'列为索引
df.set_index('day', inplace=True)

# 将数值列转换为浮点型
df[['open', 'high', 'low', 'close', 'volume']] = df[['open', 'high', 'low', 'close', 'volume']].astype(float)

# 绘制收盘价随时间变化的图像
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['close'], label='Close Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.title('Stock Close Price Over Time')
plt.legend()
plt.grid(True)
plt.show()

通过调用matplotlib库对爬取的数据进行分析可以绘制如下的图像:

相关推荐
努力の小熊1 天前
基于tensorflow框架的MSCNN-LSTM模型在CWRU轴承故障诊断的应用
人工智能·tensorflow·lstm
AI即插即用1 天前
即插即用涨点系列 (八):AMDNet 详解!AAAI 2025 SOTA,MLP 融合多尺度分解(MDM)与 AMS 的涨点新范式。
人工智能·pytorch·深度学习·目标检测·计算机视觉·transformer
脑极体1 天前
穿越沙海:中国AI的中东远征
人工智能·搜索引擎
jn100105371 天前
【概念科普】原位CT(In-situ CT)技术详解:从定义到应用的系统梳理
人工智能
禾风wyh1 天前
(ICLR 2019)APPNP传播用 PageRank,不用神经网络!
人工智能·深度学习·神经网络
Keep_Trying_Go1 天前
论文STEERER人群计数,车辆计数以及农作物计数算法详解(pytorch)
人工智能·pytorch·python
gzu_011 天前
基于昇腾 配置pytorch环境
人工智能·pytorch·python
陈 洪 伟1 天前
AI理论知识系统复习(6):梯度饱和、梯度消失、梯度爆炸
人工智能
云在Steven1 天前
在线确定性算法与自适应启发式在虚拟机动态整合中的竞争分析与性能优化
人工智能·算法·性能优化
mit6.8241 天前
[AI tradingOS] AI决策引擎 | decision/engine.go | 交易哲学prompts
人工智能·区块链