Python爬取网易财经股票数据并绘制K线图实战

一颗松果
一颗松果
发布时间:2026-10-13| 6人浏览过
原创

本文详解如何利用Python从网易财经抓取股票历史交易数据,并通过Matplotlib库绘制日K线图。内容涵盖数据解析、正则处理、CSV保存及可视化绘图全流程,帮助开发者掌握金融数据抓取与可视化的核心技能。

Python股票数据获取与K线图绘制教程

导言

本文简要介绍如何从网易财经网站获取特定股票的价格数据,并基于这些数据绘制对应的日K线图。该教程旨在帮助初学者理解并应用Python的相关功能,涉及列表操作、自定义函数编写、for循环、条件判断以及使用matplotlib库进行图形绘制等知识点。

从网易财经获取股票数据

第一步:从网易财经获取股票的价格数据

通常通过网易财经查看股票价格和成交数据,该平台支持查询任意沪深市场的股票。本文以招商银行的数据为例进行说明。

构建爬虫获取股票价格数据

1、构建爬虫获取股票价格数据

此处不再赘述Python的基础概念,若需了解Python,可自行搜索或访问Python官方网站。

加载模块与时间设定

加载需要的模块

代码如下:


import re,urllib2,time,csv,datetime
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
import matplotlib.dates as mpd

其中urllib2用于解析HTML内容,主要功能是从指定URL获取网页内容;re是正则表达式模块,本文利用正则表达式从抓取的网页数据中提取有用信息;time和datetime是与时间相关的模块,主要用于设定抓取的时间范围及其他时间处理;csv模块用于生成CSV数据(该数据后续将被用于R语言绘制K线图);其余模块将在使用时单独介绍,也可根据需要在程序头部补充import语句。

设定时间相关

代码如下:


t = time.localtime() # 获取当前的本地时间
year = range(t[0],1989,-1) # 设定年度范围,从当前年度至沪市开市的年份倒序生成
season = range(4,0,-1)  # 生成季度的数据列表,从4季度到1季度倒序生成

为何如此设定时间?仔细查看网易股票数据的URL结构,其按照年度和季度构成,数据搜索也是基于年度和季度进行的。

招商银行2017年1季度数据

其URL构成如下:http://quotes.money.163.com/trade/lsjysj_600036.html?year=2017&season=1。可见该URL可拆分为6个子字符串,分别是http://quotes.money.163.com/trade/lsjysj_、600036、.html?year=、2017、&season=、1。其中第2、4、6个子串可以参数化输入,以获取特定需求的数据。

定义获取数据的函数

定义获取数据的函数

代码如下:


def getData(url):
  request = urllib2.Request(url)
  response = urllib2.urlopen(request)
  content = response.read()

  pattern = re.compile('</thead[\s\S]*</tr>  </table>')
  ta = re.findall(pattern, str(content))
  pattern1 = re.compile("<td class='cGreen'>")
  pattern2 = re.compile("<td class='cRed'>")
  pattern3 = re.compile(",")
  tab1 = re.sub(pattern1,"<td>",str(ta))
  tab2 = re.sub(pattern2,"<td>",str(tab1))
  tab = re.sub(pattern3, "", str(tab2))

  if len(tab) == 0:
    data = []
  else:
    pattern3 = re.compile('<td>(.*?)</td>')
    data = re.findall(pattern3, str(tab))

  for d in data:
    if d == '':
      data.remove('')

  return data

本段代码定义了一个名为getData(url)的函数,参数为url。该函数旨在从指定URL获取股票的交易数据,显然这是一个定制化的函数。

首先,使用urllib2模块的相关函数解析并获取网页数据。第二步,使用re模块对抓取的网页内容进行初步处理,分为三个过程:

  1. 首先匹配"</thead[\s\S]*</tr> </table>"之间的内容并返回,因为这两者之间的内容包含了所有需要的数据,这是一个简单的正则表达式,表示返回</thead和</tr> </table>两个字符串之间的所有内容。
  2. 匹配<td class='cGreen'>、<td class='cRed'>并使用<td>替换,因为这两个字符串会影响后续的数据匹配,先行替换可以更便捷地匹配到所需数据。
  3. 替换千分位","号,因为Python和R无法识别带有千分位符的数据,所以需要将数据转换为无千分位的形式。
  4. tab是按要求最后获取的包含数据和文本的原始内容。
  5. 使用if函数获取除文本外的数据,因为如果year和season超过当前界限,会返回空的tab,因此在此处进行判断。若缺少此判断,会报出index error。该if函数表示:如果tab为空,data也为空列表;如果tab不为空,则根据pattern3返回所需数据至data列表。
  6. 使用for循环遍历data列表,删除空白内容(其实这一步不需要,因为在if中已经剔除了空内容。

因此定义了以上函数后,即可使用该函数返回特定URL的数据。

获取某支股票的历史数据

获取某支股票的数据

代码如下:


def get_stock_price(code):
  url1 = "http://quotes.money.163.com/trade/lsjysj_"
  url2 = ".html?year="
  url3 = "&season="
  urllist = []
  for k in year:
    for v in season:
      urllist.append(url1+str(code)+url2+str(k)+url3+str(v))
  
  price = []
  for url in urllist:
    price.extend(getData(url))
  return price

自定义get_stock_price(code)函数,code指股票代码,使用该函数可以返回该股票的所有历史数据(OHLC及其他)。思路很简单:

  1. 根据code构建其股票数据页面的URL列表。
  2. 使用getData(url)函数和for循环,返回所有的历史数据。

最终返回的是price的数据列表。

这样,我们就可以使用该函数获取某支股票的所有历史数据:


# get all histrocial data include all price and others
price = get_stock_price(600036)

获取招商银行(600036)的所有历史数据。

保存数据为CSV文件

2、保存数据

保存为csv文件

代码如下:


writer = csv.writer(file("stock.csv",'wb'))
writer.writerow(['Date','Open','High','Low','Close','Volume'])
pr = []
for i in range(0,len(price),11):
  pr.extend([[price[i],price[i+1],price[i+2],price[i+3],price[i+4],price[i+8]]])

for prl in pr:
  writer.writerow(prl)

我们使用csv模块将数据保存为csv文件,用于在R中读取并作图。通过查看网易的数据展示可以发现,总共11个字段,因此我们在每11个切片中,返回时间、OHLC(开盘价、最高价、最低价、收盘价)和交易量的数据,并保存为csv文件格式。

处理保存数据到列表

代码如下:


# get the number for date by date2num
def Date_no(strdate):
  t = time.strptime(strdate, "%Y-%m-%d")
  y,m,d = t[0:3]
  d = datetime.date(y, m, d)
  n = mpd.date2num(d)

  return n

# get the price data 
pr = []
for i in range(0,len(price),11):
  pr.extend([[
    Date_no(price[i])
    ,float(price[i+1])
    ,float(price[i+2])
    ,float(price[i+3])
    ,float(price[i+4])
    ,float(price[i+8])]]
    )

这个程序片段是用来处理和保存数据,用于在Python中做出K线图。

定义函数将字符串的时间处理为matplotlib中作图使用的数值(直接获取的数据中时间是字符串)。 返回时间、OHLC(开盘价、最高价、最低价、收盘价)和交易量的数据,并存储在pr这个列表里。

绘制K线图

第二步:做出K线图

在R中绘制K线图

在R中作图

代码如下:


library(quantmod)

rm(list = ls())
setwd("~/GitHub/index/")
price <- as.xts(read.zoo("stock.csv",header=TRUE,sep=",",colClasses = c("Date", rep("numeric",5))))

n <- nrow(price)
m <- nrow(price)-100

#pdf(file = "k.pdf")
chartSeries(price[c(m:n)],theme = chartTheme("white"),up.col = "red",dn.col = "green",name = "600036",time.scale = 0.5,line.type = "l",bar.type = "ohlc",major.ticks='auto', minor.ticks=TRUE)
#dev.off()

做出的图片效果如下:

 

在R中可以使用quantmod包中的chartSeries函数画出K线图,具体的使用方法可以参考chartSeries参考文档。

在Python中使用Matplotlib作图

在Python中使用matplotlib作图

代码如下:


quotes = pr[0:80]

print(quotes)

fig,ax = plt.subplots(figsize=(30,6))
fig.subplots_adjust(bottom=0.2)
mpf.candlestick_ohlc(ax,quotes,width=0.4,colorup='r',colordown='g')
plt.grid(False)
ax.xaxis_date()
ax.autoscale_view()
plt.setp(plt.gca().get_xticklabels(), rotation=30) 
plt.show()

K线效果图如下:

使用matplotlib的candlestick_ohlc的参考文档,但是目前有一些问题,比如会将非交易日期也置放在x轴,会导致K线出现断裂,等待下一步的解决方法吧。

相关的代码已经同步到最大的同性交友网站我的Github上了,可以参考,其中stock.py是主要程序。

写在最后:因为我有近5年没使用过Python了,所有代码可能不太简练。我也旨在解决问题,当然解决问题的方法千万种,比如这个例子,最直接的办法就是使用网易的下载所有(或者特定时间段)的数据为csv格式,然后用Excel画K线也可以的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。