码迷,mamicode.com
首页 > 编程语言 > 详细

Python爬虫 股票数据爬取

时间:2018-03-08 00:11:46      阅读:1294      评论:0      收藏:0      [点我收藏+]

标签:try   efk   sina   def   平安银行   ctr   class   合并   文章   

前一篇提到了与股票数据相关的可能几种数据情况,本篇接着上篇,介绍一下多个网页的数据爬取。目标抓取平安银行(000001)从1989年~2017年的全部财务数据。

数据源分析

地址分析

http://money.finance.sina.com.cn/corp/go.php/vFD_FinancialGuideLine/stockid/000001/ctrl/2017/displaytype/4.phtml

在浏览器(PC上)中打开这个地址,就可以看到下图显示的财务数据。这个地址是一个通用格式:
(1)000001:是股票代码,换成其它代码就对应于其它股票财务数据;
(2)2017:是财务数据年份,这里2017就显示2017年的财务数据。2017年12月的财务数据要18年3月才出,暂时没有。其它年份数据替换相应年份即可查看。

技术分享图片

抓取分析

(1)右键查看源码,可以看到目标财务数据在源码中。所以核心方法同前。此处的关键内容xPath是:table id = “BalanceSheetNewTable0”

技术分享图片

(2)与前文抓取分红数据不同的是,分红只有一页,这里涉及到多页数据,且页数还不统一。这比分红数据抓取要多解决两个问题:第一,要把不同年份的数据放在一起,进行拼接。第二,要判断最旧的年份是什么时候,什么时候停止抓取。

爬虫程序

运行环境:Win10系统;Python 3.0;Sublime Text编辑;
(1)先上程序。好像源码效果,先上截图,相关说明见代码注释。源码见后面。

技术分享图片

技术分享图片

技术分享图片

上图中的绿色方框是本文与前文的重要区别。
(i)实现了将之前获得的dataframe格式数据(dataArr)与最新获得的dataframe格式数据(df)进行了合并。 利用了pandas包的自带函数:

dataArr = [dataArr,df]
dataArr = pd.concat(dataArr,axis=1,join=’inner’)

(ii)同时利用与空数据合并会产生异常,进行初始和结尾数据的判断。见蓝色框代码。

(2)运行结果。这里仅部分显示。要利用这些数据还需做更多处理。

http://www.aibbt.com/a/18042.html

技术分享图片

小结

Python爬虫编程非常之简洁,核心代码只需要几行就能抓取想要的数据。其它的都是辅助,使函数更容易使用,或数据更直观。
利用pandas自带的concat实现相同格式的dataframe数据合并;同时利用该异常进行起始和结尾判断。
对起始和结尾有更好的判断方式,其实在源码中可以抓取到全部的年份的数据地址,逐一抓取即可。

源代码

import pandas as pdimport lxml.htmlfrom lxml import etreeimport numpy as npfrom pandas.io.html import read_htmlfrom pandas.compat import StringIOtry:    from urllib.request import urlopen, Requestexcept ImportError:    from urllib2 import urlopen, Requestimport timeimport sys#地址模板FINIANCE_SINA_URL = ‘http://money.finance.sina.com.cn/corp/go.php/vFD_FinancialGuideLine/stockid/%s/ctrl/%s/displaytype/4.phtml‘;def read_html_sina_finiance1(code):
    has_data = True
    #获取当前年份
    today = pd.to_datetime(time.strftime("%x"))
    year = today.year    #数据用pandas的dataframe储存
    dataArr = pd.DataFrame()    while has_data:        #新浪财经网页数据
        furl = FINIANCE_SINA_URL%(code,year)        #获取数据,标准处理方法
        request = Request(furl)
        text = urlopen(request, timeout=5).read()
        text = text.decode(‘gbk‘)
        html = lxml.html.parse(StringIO(text))        #分离目标数据
        res = html.xpath("//table[@id=\"BalanceSheetNewTable0\"]")
        sarr = [etree.tostring(node).decode(‘gbk‘) for node in res]        #存储文件
        sarr = ‘‘.join(sarr)
        sarr = ‘<table>%s</table>‘%sarr        #向前滚动一年
        year-=1
        #对最后一页进行判断,依据是数据是否有
        try:            #将数据读入到dataframe数据个数中;并进行连接;
            df = read_html(sarr)[0]
            df.columns=range(0,df.shape[1])
            df = df.set_index(df.columns[0])
            dataArr = [dataArr, df]
            dataArr = pd.concat(dataArr, axis=1, join=‘inner‘)        except:            if (year+1)==today.year:
                has_data=True
            else:
                has_data=False
    dataArr = dataArr.T    try:
        dataArr = dataArr.set_index(dataArr.columns[0])    except:
        dataArr=dataArr    return dataArr
test = read_html_sina_finiance1(‘000001‘)
print(test)

 

Python爬虫 股票数据爬取

标签:try   efk   sina   def   平安银行   ctr   class   合并   文章   

原文地址:https://www.cnblogs.com/aibbt/p/8525410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!