Python爬股票数据(Python爬股票数据)
如何用python 爬虫抓取金融数据
获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一。鉴于此,我拾起了Python这把利器,开启了网络爬虫之路。
本篇使用的版本为python3.5,意在抓取证券之星上当天所有A股数据。程序主要分为三个部分:网页源码的获取、所需内容的提取、所得结果的整理。
一、网页源码的获取
很多人喜欢用python爬虫的原因之一就是它容易上手。只需以下几行代码既可抓取大部分网页的源码。
import urllib.request
url='ar.com/stock/ranklist_a_3_1_1.html' ?#目标网址headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64)"} ?#伪装浏览器请求报头request=urllib.request.Request(url=url,headers=headers) ?#请求服务器response=urllib.request.urlopen(request) ?#服务器应答content=response.read().decode('gbk') ? #以一定的编码方式查看源码print(content) ?#打印页面源码
虽说抓一页的源码容易,不过在一个网站内大量抓取网页源码却经常遭到服务器拦截,顿时感觉世界充满了恶意。于是我开始研习突破反爬虫限制的功法。
1.伪装流浪器报头
很多服务器通过浏览器发给它的报头来确认是否是人类用户,所以我们可以通过模仿浏览器的行为构造请求报头给服务器发送请求。服务器会识别其中的一些参数来识别你是否是人类用户,很多网站都会识别User-Agent这个参数,所以请求头最好带上。有一些警觉性比较高的网站可能还会通过其他参数识别,比如通过Accept-Language来辨别你是否是人类用户,一些有防盗链功能的网站还得带上referer这个参数等等。
2.随机生成UA
证券之星只需带User-Agent这个参数就可以抓取页面信息了,不过连续抓取几页就被服务器阻止了。于是我决定每次抓取数据时模拟不同的浏览器发送请求,而服务器通过User-Agent来识别不同浏览器,所以每次爬取页面可以通过随机生成不同的UA构造报头去请求服务器,
3.减慢爬取速度
虽然模拟了不同浏览器爬取数据,但发现有的时间段可以爬取上百页的数据,有时候却只能爬取十来页,看来服务器还会根据你的访问的频率来识别你是人类用户还是网络爬虫。所以我每抓取一页都让它随机休息几秒,加入此句代码后,每个时间段都能爬取大量股票数据了。
4.使用代理IP
天有不测风云,程序在公司时顺利测试成功,回寝室后发现又只能抓取几页就被服务器阻止了。惊慌失措的我赶紧询问度娘,获知服务器可以识别你的IP,并记录此IP访问的次数,可以使用高匿的代理IP,并在抓取的过程中不断的更换,让服务器无法找出谁是真凶。此功还未修成,欲知后事如何,请听下回分解。
5.其他突破反爬虫限制的方法
很多服务器在接受浏览器请求时会发送一个cookie文件给浏览器,然后通过cookie来跟踪你的访问过程,为了不让服务器识别出你是爬虫,建议最好带上cookie一起去爬取数据;如果遇上要模拟登陆的网站,为了不让自己的账号被拉黑,可以申请大量的账号,然后再爬入,此处涉及模拟登陆、验证码识别等知识,暂时不再深究...总之,对于网站主人来说,有些爬虫确实是令人讨厌的,所以会想出很多方法限制爬虫的进入,所以我们在强行进入之后也得注意些礼仪,别把人家的网站给拖垮了。
二、所需内容的提取
获取网页源码后,我们就可以从中提取我们所需要的数据了。从源码中获取所需信息的方法有很多,使用正则表达式就是比较经典的方法之一。我们先来看所采集网页源码的部分内容。
为了减少干扰,我先用正则表达式从整个页面源码中匹配出以上的主体部分,然后从主体部分中匹配出每只股票的信息。代码如下。
pattern=re.compile('tbody[\s\S]*/tbody') ?
body=re.findall(pattern,str(content)) ?#匹配tbody和/tbody之间的所有代码pattern=re.compile('(.*?)')
stock_page=re.findall(pattern,body[0]) ?#匹配和之间的所有信息
其中compile方法为编译匹配模式,findall方法用此匹配模式去匹配出所需信息,并以列表的方式返回。正则表达式的语法还挺多的,下面我只罗列所用到符号的含义。
语法 ? ?说明 ?
. ? ?匹配任意除换行符“\n”外的字符 ?
* ? ?匹配前一个字符0次或无限次 ?
? ? ?匹配前一个字符0次或一次 ?
\s ? ?空白字符:[空格\t\r\n\f\v] ?
\S ? ?非空白字符:[^\s] ?
[...] ? ?字符集,对应的位置可以是字符集中任意字符 ?
(...) ? ?被括起来的表达式将作为分组,里面一般为我们所需提取的内容 ?
正则表达式的语法挺多的,也许有大牛只要一句正则表达式就可提取我想提取的内容。在提取股票主体部分代码时发现有人用xpath表达式提取显得更简洁一些,看来页面解析也有很长的一段路要走。
三、所得结果的整理
通过非贪婪模式(.*?)匹配和之间的所有数据,会匹配出一些空白字符出来,所以我们采用如下代码把空白字符移除。
stock_last=stock_total[:] #stock_total:匹配出的股票数据for data in stock_total: ?#stock_last:整理后的股票数据
if data=='':
stock_last.remove('')
最后,我们可以打印几列数据看下效果,代码如下
print('代码','\t','简称',' ? ','\t','最新价','\t','涨跌幅','\t','涨跌额','\t','5分钟涨幅')for i in range(0,len(stock_last),13): ? ? ? ?#网页总共有13列数据
print(stock_last[i],'\t',stock_last[i+1],' ','\t',stock_last[i+2],' ?','\t',stock_last[i+3],' ?','\t',stock_last[i+4],' ?','\t',stock_last[i+5])
如何用python获取股票数据
在Python的QSTK中,是通过s_datapath变量,定义相应股票数据所在的文件夹。一般可以通过QSDATA这个环境变量来设置对应的数据文件夹。具体的股票数据来源,例如沪深、港股等市场,你可以使用免费的WDZ程序输出相应日线、5分钟数据到s_datapath变量所指定的文件夹中。然后可使用Python的QSTK中,qstkutil.DataAccess进行数据访问。
如何使用Python获取股票分时成交数据?
可以使用爬虫来爬取数据,在写个处理逻辑进行数据的整理。你可以详细说明下你的需求,要爬取的网站等等。
希望我的回答对你有帮助
python读取财经数据
提取日期数据基本语法
from WindPy import w
w.start()
当出现.ErrorCode==-103说明没连接上,要start一下
w.wsd(security, fields, startDate = None, endDate= None , options = None)
opion 可选(period, 日期类型, 货币类型,前后复权)
提取财务数据基本语法
w.wss(security, fields, options = None)
提取板块日序列基本语法
w.wses(sectorCode, fields, startDate = None, endDate = None, options = None)
提取板块日截面数据基本语法
w.wsee(sectorCode, fields, options=None)
提取宏观数据基本语法
w.edb(codes, startDate =None, endDate =None, options=None)
1.日期序列基本语法
ts.get_hist_data(stock,start,end)
注意:1.stock不能是集合,只能单个股票 2.需要带上.sz或.sh 3.没有field,只能取出数据后再切除.
2.pro用法
pro.daily(code, start, end, fields)
tushare引用语句
弊端也很明显,一方面不能stock集合输入,一次只能调取一个股票对应数据,另一方面tushare虽是免费试用,但有权限限制。
基本语法
wb.get_data_yahoo(code, start, end)
wb.DataReader(code, 'yahoo', start, end)
没法添加fields, 虽能集合适用,但出来的索引挺奇怪的
推荐使用定义函数或用for循环批量获取数据
总体感觉wind api最舒服,但需要账号,mac也不能直接调用wind api。还是推荐tushare的pro用法。
小白学习中,请指教=v=
怎么学python爬取财经信息
本程序使用Python 2.7.6编写,扩展了Python自带的HTMLParser,自动根据预设的股票代码列表,从Yahoo Finance抓取列表中的数据日期、股票名称、实时报价、当日变化率、当日最低价、当日最高价。
由于Yahoo Finance的股票页面中的数值都有相应id。
例如纳斯达克100指数ETF(QQQ)
其中实时报价的HTML标记为
[html]?view plain?copy
span?id="yfs_l84_qqq"87.49/span
而标普500指数ETF(SPY)
其中实时报价的HTML标记为
[html]?view plain?copy
span?id="yfs_l84_spy"187.25/span
因此本数据抓取程序根据相应的id字符串来查找数据。具体来说就是先继承HTMLParser,然后在自定义的子类中重载handle_data(self, data)方法,查找包含相应id字符串(例如实时报价的id字符串为"yfs_l84_"+股票代码)的HTML标记,并输出这个HTML标记中的数据(例如qqq的span id="yfs_l84_qqq"87.49/span,其中的数据87.49就是实时报价。)
样本输出:
数据依次是
数据日期 股票代码 ?股票名称 实时报价 ?日变化率 日最低价 ?日最高价
[python]?view plain?copy
05/05/2014??ibb?iShares?Nasdaq?Biotechnology?(IBB)??233.28??1.85%???225.34??233.28
05/05/2014??socl????Global?X?Social?Media?Index?ETF?(SOCL)??17.48???0.17%???17.12???17.53
05/05/2014??pnqi????PowerShares?NASDAQ?Internet?(PNQI)??62.61???0.35%???61.46???62.74
05/05/2014??xsd?SPDR?SP?Semiconductor?ETF?(XSD)????67.15???0.12%???66.20???67.41
05/05/2014??ita?iShares?US?Aerospace??Defense?(ITA)????110.34??1.15%???108.62??110.56
05/05/2014??iai?iShares?US?Broker-Dealers?(IAI)?37.42???-0.21%??36.86???37.42
05/05/2014??vbk?Vanguard?Small?Cap?Growth?ETF?(VBK)?119.97??-0.03%??118.37??120.09
05/05/2014??qqq?PowerShares?QQQ?(QQQ)???87.95???0.53%???86.76???87.97
05/05/2014??ewi?iShares?MSCI?Italy?Capped?(EWI)?17.86???-0.56%??17.65???17.89
05/05/2014??dfe?WisdomTree?Europe?SmallCap?Dividend?(DFE)???62.33???-0.11%??61.94???62.39
05/05/2014??pbd?PowerShares?Global?Clean?Energy?(PBD)???13.03???0.00%???12.97???13.05
05/05/2014??eirl????iShares?MSCI?Ireland?Capped?(EIRL)??38.52???-0.16%??38.39???38.60