前一篇提到了与股票数据相关的可能几种数据情况,本篇接着上篇,介绍一下多个网页的数据爬取。目标抓取平安银行(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爬虫 股票数据爬取的更多相关文章

  1. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

  2. Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取

    很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...

  3. Python爬虫实例:爬取猫眼电影——破解字体反爬

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  4. python爬虫-基础入门-爬取整个网站《2》

    python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...

  5. python爬虫-基础入门-爬取整个网站《1》

    python爬虫-基础入门-爬取整个网站<1> 描述: 使用环境:python2.7.15 ,开发工具:pycharm,现爬取一个网站页面(http://www.baidu.com)所有数 ...

  6. Python爬虫教程-17-ajax爬取实例(豆瓣电影)

    Python爬虫教程-17-ajax爬取实例(豆瓣电影) ajax: 简单的说,就是一段js代码,通过这段代码,可以让页面发送异步的请求,或者向服务器发送一个东西,即和服务器进行交互 对于ajax: ...

  7. Python爬虫实战之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的任意帖子进行抓取 指定是否只抓取楼主发帖 ...

  8. Python爬虫实例:爬取豆瓣Top250

    入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...

  9. python爬虫-基础入门-爬取整个网站《3》

    python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...

随机推荐

  1. MDT 2013 从入门到精通之概念扫盲

    从今日开始为大家带来微软MDT 2013批量部署操作系统从入门到精通系列教程,旨在为大家以后的工作.学习提供一个便利的参考教程,以便大家更好.更深入的了解微软MDT,从而减轻企业工程师.IT从业人员及 ...

  2. 项目中引入composer

    众所周知,composer可以自定义加载插件库和依赖,它也是用PHP写的,怎样在自己的项目中引入并使用composer呢?. 1.新建一个项目,在项目的根目录创建composer.json文件,用过一 ...

  3. Base64算法原理

    3个Byte (3 X 8 = 24 bits) 以3个字节为单位,依次取6位数据,并在前面补上2个0.这样就增加了一个字节的数据.

  4. 织梦去除tag标签url中的问号

    找到文件 include\taglib\tag.lib.php  大概87行 把 $row['link'] = $cfg_cmsurl."/tags.php?/".urlencod ...

  5. ubuntu16 ftp 服务 vsftp 配置

    转载:沐心_ 地址:http://bbs.csdn.net/topics/392186116------------------------------------------------------ ...

  6. 01_JavaSE之OOP--面向对象(类和面向对象的简单认识)

    面向对象(一) 一.面向对象概述 谈到面向对象就不得不谈谈面向过程,面向对象也是由面向过程发展而来. 面向过程思想概述 面向过程,简而言之就是分步骤,过程化的去解决问题,代表语言有:Pascal,C等 ...

  7. C/C++语言简介之发展历史

    C语言之所以命名为C,是因为 C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言. 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BC ...

  8. qemu-trustzone编译&运行(包含linux内核的编译方法)

    由于之前都是用的mtk6797开发板,回到实验室之后想要做实验的话需要弄一个支持trustzone的qemu,在这里记录一下我的编译和调试过程.本来最近一直忙着看论文和写论文,但是忽然发现自己在实验部 ...

  9. 函数重载overload

    与void show(int a, char b, double c){}构成重载的有: a) void show(int x, char y, double z){} //no b) int sho ...

  10. 第二十二章 Django会话与表单验证

    第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...