编写股票程序用到的库
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(′[0−9]∗’,’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注册链接地址