股票数据爬取常用库及方法

编写股票程序用到的库

pandas_datareader: 是一个远程获取金融数据的python工具,一个第三方库

urllib:可以以get和post的方式抓取网络数据,标准库

pandas:包含标准数据模型,能高效操作大型数据集,第三方库

re:封装了正则表达式的功能,python核心库

matplotlib:封装了实现可视化的功能,第三方库

Tushare:封装了采集分析和加工股票等金融数据的功能,一个免费开源的第三方财经数据接口包

提示:在使用pip安装第三方库时,打开安装python的目录,进入Scripts目录中打开cmd,执行命令

rr 库名 ,系统会自动通过pip下载最新的库。若提示pip安装程序不是最新版则执行以下命令更新pip:python -m pip install --upgrade pip

调用urlopen方法爬取数据

urlopen(url,data=None,[timeout])

所属模块 urllib.request

爬取网易网站数据所使用的各个参数及含义

参数名说明
code股票代码
start抓取数据的开始时间,格式是yyyymmdd
end抓取数据的结束时间,格式同上
fields要抓取的信息字段

fields参数所指定的字段列表

参数名说明
TCLOSE收盘价
HIGH最高价
LOW最低价
TOPEN开盘价
CHG涨跌额
PCHG涨跌幅
TURNOVER换手率
VOTURNOVER成交量
VATURNOVER成交金额
import urllib.request
stockCode='600895'
url='http://quotes.money.163.com/service/chddata/html?code=0'+stockCode+'&start=20190102&end=20190102&fields=TCLOSE;HIGH;LOW;TOPEN;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER'
print(url)
response=urllib.request.urlopen(url)
print(response.read().decode('gbk'))
response.close()

此处主体(http://quotes.money.163.com/service/chddata/html)和参数(code、start等)都放在了url中 这种请求数据的方式为GET

url='http://quotes.money.163.com/service/chddata/html'
param=bytes(urllib.parse.urlencode({'code':'0'+stockCode,'start':'20190102','end':'20200102','field':'TCLOSE;HIGH;LOW;TOPEN;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER'}),encoding='utf-8')
responese=urllib.request.urlopen(url,data=param,timeout=1)
print(responese.read().decode('gbk'))
responese.close()

此处数据放在了HTTP数据包中通过data传入参数,这种方式叫POST

GET提交数据的尺寸最大为2KB,而POST理论上没有大小限制

调用urlretrieve方法把爬取结果存入csv文件

urlretrieve(url,filename=文件名,data=参数对象)

def getAndSaveStock(stockCodeList,path):
    for stockCode in stockCodeList:
        url='http://quotes.money.163.com/service/chddata/html'
        param=bytes(urllib.parse.urlencode({'code':'0'+stockCode,'start':'20190102','end':'20200102','field':'TCLOSE;HIGH;LOW;TOPEN;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER'}),encoding='utf-8')
        #urllib.request.urlretrieve可以将爬取结果存入csv文件
        	responese=urllib.request.urlretrieve(url,path+stockCode+'.csv',data=param)

缩进有问题无法对齐 param与responese都在for循环中

以post方式请求数据 存入path路径中 文件名为stockCode+’.csv’(文件不存在自动创建文件)

正则表达式

常用正则字符

符号说明用法举例
^开始标记[0-9]+$,其中的含义是以0~9的数字开始
$结束标记[0-9]+$,其中的含义是以0~9的数字结尾
*匹配1次或多次,也能匹配空字符串1.re.match(’1′ , " ) , 目 标 字 符 串 是 空 , 能 匹 配 上 2. r e . m a t c h ( ′ [ 0 − 9 ] ∗ ',"),目标字符串是空,能匹配上 2.re.match('^[0-9]*,")2.re.match([09]’,’0‘),目标字符串是数字,能匹配上 3.re.match(’2$’,’c’),目标字符串是字母,不能匹配上
[]表示一个字符集[0-9]+$,的含义是以09的数字开始,这里[0-9]表示包含09的字符集,也就是数字。结合其他正则字符这个表达式的规则是:以09的数字开始,以09的数字结尾,该数字出现一次或多次,归纳起来就是匹配数字
a-z表示小写字母集3+$,表示以小写字母为开头和结尾,中间小写字母出现1次或多次,也就是说匹配目标字符串是否都是小写字母
|表示‘或’比如[6|3|0],表示该字符是6或3或0
{}匹配指定字符n次4 [0-9]{5}$,其中[0-9]{5}需要串联起来解读,匹配5次。该规则完整含义为以6或3或0开头,后面连接5为数字 {m}表示扩展前一个字母m次,{m,n}表示扩展前一个字母m次至n次:ab{1,2}c 表示abc、abbc
+匹配一次或多次5+$,+的含义是0~9的数字出现1次或多次
\d数字,等价于[0-9]
\w单词字符等价于[a-zA-Z0-9]
?前一个字符1次或1次扩展abc?表示ab,abc
[^]非字符集,对单个字符给出排除范围[^abc] 表示非a或b或c的单个字符import
.表示任何单字符a(.*?)b,表示匹配在a和b之间任何字符进行一次。
import re
numStr='111111111111111'
numPattern='^[0-9]+$'
if re.match(numPattern,numStr):
    print('All numbers')
stockPattern='^[6|3|0][0-9]{5}$'
stockCode='300000'
if re.match(stockPattern,stockCode):
    print('is stock Code')

re.match(pattern,str)

pattern为正则匹配规则 ,str为被匹配的字符串

匹配成功则返回为真

一般正则表达式这么用

str='1'
pattern='^[\d]*$'
if re.match(pattern,str):
    print('Matched!')

匹配以数字开头数字结尾,数字长度任意

综合使用爬虫和正则表达式

import requests     #requests库相当于urllib的升级版 更好爬取数据
import re       #正则

def printAndSaveStock(code):
    #新浪网址
    url='http://hq.sinajs.cn/list='+code
    #通过get(url).text从指定网址获取数据并以文本方式返回
    response=requests.get(url).text
    #匹配规则为""间所有数据 每次匹配时匹配最小单元 如:'"123","123"' 匹配到的为123  而(.*)为  123","123
    rule=r'"(.*?)"'
    #以列表的形式返回匹配到的结果 每次由rule规则匹配到的结果为列表的一个元素
    result=re.findall(rule,response)
    print(result[0])
    filename='C:\\Users\\28189\\Desktop\\爬虫\\自学\\'+code+'.csv'
    f=open(filename,'w')
    f.write(result[0])
    f.close()

codes=['sh600895','sh600007']
for code in codes:
    printAndSaveStock(code)

利用pandas_reader库获取股市数据

pandas_reader是一个能获取各种金融数据的库,但由于get_data_yahoo这一API老旧出现了问题,因此官方推出了新的模块作为解决办法,网上大部分资料都 说通过import fix_yahoo_finance 调用pdr_override()作为解决办法,事实上现在 fix_yahoo_finance已更名为yfinance,如果直接import fix_yahoo_finance则会报错

from pandas_datareader import data as pdr
#import fix_yahoo_finance as fyf  #使用该模块会报错
import yfinance as yf
yf.pdr_override()
code='600895.ss'
stock=pdr.get_data_yahoo(code,'2019-01-01','2019-01-02')
print(stock)

关于股票代码多说一点:股票代码后缀为.ss为沪股 .sz为深股 .hk为港股 无后缀为美股

使用Tushare库来获取上市公司的信息

Tushare是python的财经数据接口库,主要实现对股票等金融数据从数据采集、加工清洗到数据存储过程,能够提供快速整洁和多样便于分析的数据 (现接口已更新为Tushare Pro)
使用时需要填写token(每个tushare用户都会有一个)注册后会有
tushare注册链接地址


  1. 0-9 ↩︎

  2. 0-9 ↩︎

  3. a-z ↩︎

  4. 6|3|0 ↩︎

  5. 0-9 ↩︎


版权声明:本文为weixin_45469491原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。