>

Python爬虫实战,使用Python画股票的K线图

- 编辑:www.bifa688.com -

Python爬虫实战,使用Python画股票的K线图

图片 1

导言

本文简要介绍了怎么着从和讯金融获取某支股票的标价多少,并依据价格多少画出相应的
日K线图。有助于新手通晓并动用Python的连带作用。包涵列表、自定义函数、for循
环、if函数以及哪些运用matplotlib进行绘图等内容。

导言

正文简要介绍了何等从博客园金融获取某支股票(stock)的标价多少,并依照价格数据画出相应的
日K线图。有助于新手掌握并利用Python的相关职能。包含列表、自定义函数、for循
环、if函数以及哪些选择matplotlib实行绘图等内容。

作者说:通过本文,读者能够操纵分析网页的才干、Python编写互联网程序的法子、Excel的操作,以及正则表达式的运用。那一个都以爬虫项目中不能缺少的学问和手艺。本文选自《Python带本人起飞》。

率先步:从搜狐金融获取股票(stock)的标价多少

自己一般是在网易金融查阅某支股票(stock)的价钱和成交数量,微博财经能够查到跋扈沪深的股票(stock),大家运用招引客商业银行行的数据作为参照他事他说加以考察。

先是步:从新浪经济获取股票(stock)的价格多少

自己一般是在腾讯网经济查阅某支期货的价位和成交数据,和讯经济能够查到任性沪深的股票(stock),我们采纳招引客商业银行行的多寡作为参照他事他说加以考察。

实例描述:通过编写制定爬虫,将点名日期时段内的满贯上市镇团股票(stock)数据爬取下来,并服从期货(Futures)代码保存到相应的Excel文件中。

一、创设爬虫获取股价数据

那边不对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

在那之中urllib二是用来解析HTML内容的包,主纵然从url获取网页内容;re是正则表明式包,本文仲动用正则表明式来从抓取的网页数据中得到到有用的数码;time和datetime是岁月相关的包,重要用来设定要抓取的时日以及其余相关时间的管理;csv包是用来生成csv数据(该多少会被用于XC90来画K线图),别的的多少个包会在选拔时独立介绍,你也得以在急需的时候在程序底部补充import。

设定时期相关

代码如下:

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

怎么要这么设按期期吗?仔细的查看微博股票(stock)数量的url,是安份守己年度和季度来组成的,大家开采找出数据也是用年度和季度来寻找的。

图片 2

招引客商业银行行201柒年一季度数据

其url构成如下:可知可拆为多少个子字符串,分别是600036.html?year=2017&season=1。当中第2、四、多少个子串能够参数化输入获取一定需要的数量。

概念获取数据的函数

代码如下:

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

    pattern = re.compile('</thead[sS]*</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

本段代码定义个2个函数getDate(url),函数名字为getData,参数为url。也正是从该url获取股票(stock)的贸易数额,明显这几个函数是定制的。

第一,大家用urllib贰模块的相关函数解析并取得网页的数量。第壹步,使用re模块的数目对抓取的网页内容进行开始的管理,分为了四个经过

  1. 首先相配"</thead[sS]*</tr> </table>"之间的源委并回到,因为在那中间的内容包含了富有须求的多少,那是二个大致的正则表明式,表示回去</thead和</tr> </table>五个字符串之间的有着剧情
  2. 匹配<td class='c格林'>、<td class='cRed'>并动用<td>替换,因为那五个字符串会潜移默化接二连三的相配数据,现行反革命替换掉可以更方便人民群众的同盟到需求的数量
  3. 轮换来千分位","号,因为Python和福特Explorer并不会识别有千分位号的数据,所以大家要将数据转变为非千分位的数量。
  4. tab是遵照要求最终得到的蕴藏数据和文件的固有内容
  5. 用if函数来得到除文本的数码,因为如若year和season超越了当下的数不完,会再次回到空的tab,所以大家在此处开展推断,要是少了这些论断,会报出index error。那些if函数表示了一旦tab为空,data也是个空的列表,倘诺tab不为空,那么依据pattern三再次回到供给的数量至data列表
  6. 用一个for循环来遍历data列表,删除空白的内容(其实这一步没有需求,因为在if中早就去除了空的剧情。

故而定义了上述的函数后,就足以接纳该函数重临特定url的多少。

获得某支股票(stock)的数据

代码如下:

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是指期货(Futures)代码,使用该函数能够回到该股票(stock)全数的历史数据(OHLC以及别的)思路很简单:

  1. 据他们说code构建其股票(stock)数量的页面的url列表
  2. 动用getData(url)函数和for循环,重返全数的历史数据

末段回到的是price的数量列表

这么,大家就足以接纳该函数到手某支股票(stock)的有所历史数据:

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

获取招商业银行行(四千3陆)的兼具历史数据。

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

个中urllib贰是用来解析HTML内容的包,重假诺从url获取网页内容;re是正则表明式包,本文仲动用正则表明式来从抓取的网页数据中赢获得有用的数额;time和datetime是光阴相关的包,首要用于设定要抓取的时光以及任何有关时间的管理;csv包是用来生成csv数据(该数量会被用于LAND来画K线图),别的的多少个包会在行使时独自介绍,你也得以在须要的时候在程序尾部补充import。

设定时期相关

代码如下:

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

干什么要这么设定时间啊?仔细的查阅新浪期货数量的url,是比照年度和季度来构成的,大家开采找寻数据也是用年度和季度来搜索的。

招商业银行行2017年一季度数据

其url构成如下:http://quotes.money.163.com/trade/lsjysj_600036.html?year=2017&season=1可见可拆为伍个子字符串,分别是http://quotes.money.163.com/trade/lsjysj_600036.html?year=2017&season=1。当中第三、4、多少个子串能够参数化输入获取特定需要的数码。

概念获取数据的函数

代码如下:

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

    pattern = re.compile('</thead[sS]*</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

本段代码定义个八个函数getDate(url),函数名字为getData,参数为url。也就是从该url获取股票的交易数据,显明这么些函数是定制的。

率先,我们用urllib贰模块的相关函数解析并得到网页的数码。第3步,使用re模块的数额对抓取的网页内容实行初叶的拍卖,分为了四个进度

  1. 第一相配"</thead[sS]*</tr> </table>"之间的源委并回到,因为在这时期的从头到尾的经过涵盖了富有须求的数据,那是三个简短的正则表明式,表示回去</thead和</tr> </table>多个字符串之间的具备内容
  2. 相称<td class='c格林'>、<td class='cRed'>并运用<td>替换,因为那多个字符串会潜移默化一连的相称数据,现行反革命替换掉能够更利于的合作到须求的数码
  3. 轮换成千分位","号,因为Python和PRADO并不会识别有千分位号的数量,所以我们要将数据转变为非千分位的数目。
  4. tab是遵从要求最终获得的盈盈数据和文书的原始内容
  5. 用if函数来赢得除文本的数额,因为只要year和season当先了现阶段的尽头,会重回空的tab,所以大家在此间进行决断,固然少了这些论断,会报出index error。那几个if函数表示了假使tab为空,data也是个空的列表,假若tab不为空,那么根据pattern3重临须要的数码至data列表
  6. 用2个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)

获得招引客商业银行行(50003陆)的全体历史数据。

那几个案例主要分为两大步子:

贰、保存数据

保存为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文件,用于在帕杰罗中读取并绘制,我们查阅在和讯的数据显示能够发掘,总共十三个字段,全部我们在每十一个切成片中,再次来到时间、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])]]
        )

那几个程序片段是用来管理和封存数据用于在pyhton中做出K线图。

  1. 概念函数将字符串的光阴管理为matplotlib中绘制使用的数值(直接获取的数目中时间是字符串)
  2. 回来重回时间、OHLC(开盘价、最高价、最低价、收盘价)和交易量的多寡并蕴藏在pr这些列表里

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文件,用于在奇骏中读取并绘制,大家查阅在腾讯网的数目展现能够窥见,总共13个字段,全数我们在每10个切成片中,重回时间、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])]]
        )

以此顺序片段是用来处理和封存数据用于在pyhton中做出K线图。

  1. 概念函数将字符串的时刻管理为matplotlib中绘制使用的数值(直接获得的多少中时间是字符串)
  2. 回去重临时间、OHLC(开盘价、最高价、最低价、收盘价)和交易量的数目并蕴藏在pr这一个列表里

(1)要明白上市集团有何;

第二步:做出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()

做出的图形效果如下:

图片 3

Highlander中得以选择quantmod包中的chartSeries函数画出K线图,具体的选拔办法能够参照chartSeries参谋文书档案

在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线效果图如下:

图片 4

使用matplotlib的candlestick_ohlc的参谋文书档案,可是近年来有部分难题,举个例子会将非交易日期也置放在x轴,会到至K线出现断裂,等待下一步的消除方法呢。

连锁的代码已经一同到最大的同性交友网址我的Github上了,能够参照,个中stock.py是重大程序。

写在结尾:因为我有近5年没动用过python了,所有代码或许不太轻易。小编也意在缓慢解决难题,当然化解难点的法子千万种,比方这几个事例,最直接的办法即是采用天涯论坛的下载全部(或许特定时期段)的数量为csv格式,然后用Excel画K线也足以的。

作者:allenmagic
链接:
來源:简书
文章权归作者全部。商业转发请联系小编得到授权,非商业转发请注解出处。

第二步:做出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()

做出的图纸效果如下:

CR-V中得以利用quantmod包中的chartSeries函数画出K线图,具体的利用办法可以参谋chartSeries参谋文书档案

在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的参考文书档案,不过近期有1对主题材料,举个例子会将非交易日期也置放在x轴,会到至K线出现断裂,等待下一步的缓和形式吧。

有关的代码已经联合到最大的同性交友网址我的Github上了,能够参照,个中stock.py是重中之重程序。

写在终极:因为小编有近五年没利用过python了,全数代码可能不太轻易。笔者也意在减轻难点,当然消除难点的方法千万种,比方那么些例子,最直白的法子正是采纳天涯论坛的下载全体(大概特定时期段)的数量为csv格式,然后用Excel画K线也足以的。

(二)根据每一个上市集团的期货(Futures)编号爬取数据。

由于两有个别代码相对比较独立,能够做成多个代码文件。贰个文本用来爬取股票代码,另一个文件用来爬取股票(stock)内容。

图片 5

一 爬取股票(stock)代码

爬取证券物运输代理码的基本思路是:

(一)分析网址上的网页源代码,找到对象代码。

(二)利用正则表明式,在全部网页里搜寻目的代码,从而提抽取所要的音信(股票(stock)代码)。

至于金融股票(stock)领域的网站一般都会有上市集团的股票(stock)代码讯息。随意找一个就能够。

一.一 找到对象网址

动用Chrome浏览器访问链接:http://quote.eastmoney.com/stocklist.html。能够看看整个的股票代码。
图片 6
图一 证券代码网页

一.二 展开调试窗口,查看网页代码

有限支撑如今浏览器窗口为移动页面,按F1二键显示出网页的源代码调节和测试窗口,单击调节和测试窗口的Element开关,能够见到页面包车型大巴HTML代码。
图片 7
图二 调节和测试窗口

1.三 在网页源码中找到对象成分

网页的源代码是依照HTML的语法规则自动折叠的。可以用光标在HTML代码中专擅单击将其进展。当光标移动到某些成分时,会看出右测网页中对应的成分会有生成,显示被选中状态。
图片 8
图叁 选瓜月素

箭头所指的网页源代码,正是急需关爱并爬取的从头到尾的经过。

一.肆 分析目标源代码,搜索规律

浅析上图中左侧体现的原委,与右臂代码之间的呼应关系。简单察觉,左边突显的每一种股票(stock)代码所对应的源代码格式都是原则性的。
图片 9
图4 指标源代码内容

源代码内容,正是要找到的指标代码。将代码整理成如下字符串模版:

【代码1】
图片 10

其间,“.html”前边的“股票代码”就是亟需抓取的内容。分析到这里,开辟职责就转化成:在全体网页的源码中,找到那样结构的字符串,并将里面包车型地铁股票物运输代理码提抽出来。

①.5 编写代码抓取股票(stock)代码

编辑代码实现urlTolist函数,并在该函数里福寿绵绵首要的抓取功用:

(一)通过运用urllib.request模块中的urlopen函数访问目标链接;

(2)通过urlopen重临值的read方法赢得网页的全体内容;

(叁)使用re模块下的compile函数来做正则表明式的企图模版,其模版字符串就是事先分析的网页指标代码;

(四)调用re.compile再次回到对象的findall方法,来对网页的HTML代码举办正则表达式计算。得到的回来值code正是终极的爬取结果。

代码一:爬取证券物运输代理码

【代码2】
图片 11

在地方代码中,函数urlTolist的末尾4行代码是为了让结果更是实惠而做的数值验证。即,唯有6(东京证券交易所)、0(德国首都证券交易所)、3(创业板)打头的期货代码是一蹴而就代码。

在代码中,正则表明式的模板部分(代码中的第7行),有这么壹段代码“SS(.*?)”。其中,两个“S”注解种种股票物运输代理码的前八个都以字符,是要跳过的地点。后边的括号及里面包车型地铁剧情,表示须要让正则表明式来抓取的一些。(关聂欣则表明式,不在本书介绍的内容之内,有意思味的读者能够活动钻研。不掌握也没涉及,直接这么使用就能够。)

1.陆 运维代码,显示结果

代码运转后,呈现如下内容

【代码3】
图片 12

能够看看,爬取的结果是以list的不二等秘书技存放的。前10条都是香岛证券交易所的股票(stock)。

2 爬取期货(Futures)内容

经过走访博客园提供的劳动接口,能够获得到股票(stock)内容。只需服从其提供的伸手格式,传入股票(stock)代码及所要查看的小运段,就可以取得该证券的切实数量。

为了爬取全部数量,须求遍历全数的证券代码,并调用网易的劳动接口。

二.壹 编写代码抓取批量剧情

在代码完毕上,如故使用urllib.request模块进行互连网请求,并将调用urllib.request模块下的urlretrieve函数,将重返的数据保存到Excel表里。代码如下:

代码1一-2:爬取期货内容

【代码4】
图片 13

代码中,设置的时日段为一个月,即从2014113一到贰零141231。

封存的结果放在D盘的all_stock_data路线下。为了保险保存操作平常运作,需求保险D盘下存在all_stock_data文件夹(若未有,供给创制3个)。

二.二 运转代码呈现结果

运维代码,输出如下结果:

【代码5】
图片 14

代码运维甘休之后,能够D盘的all_stock_data文件夹下找到变化的证券数据文件。
图片 15
图伍 股票(stock)数据文件

于今,爬取期货数量的案例就甘休了。读者能够依靠地点的文化,在互连网爬取更加多和气须要的剧情。另外,爬取的结果还足以保留到MySQL或任何门类文件中。

本文由必发88手机版发布,转载请注明来源:Python爬虫实战,使用Python画股票的K线图