前一篇提到了与股票数据相关的可能几种数据情况,本篇接着上篇,介绍一下多个网页的数据爬取。目标抓取平安银行(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. ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql' mysql> use mysql

    show databases;select user,password,host from user;我们想通过 查看存在"mysql"数据库中的user表来查看我们的msql数据 ...

  2. 张高兴的 Windows 10 IoT 开发笔记:部署 ASP.NET Core 2 应用

    今天是大年初二,都去走亲戚了吧,享受一下这难得的能和亲友相聚的时光.而我就不一样了,今天一回到家就又开始瞎折腾了,哈哈哈. 问题背景 最近花了点时间用 ASP.NET Core 2 写了个个人博客,中 ...

  3. servlet上传与下载

    上传页面 上传学生信息 学号  姓名  密码  性别 男 女 年龄  身高  学院  计算机学院 软件学院 照片  简历 <!DOCTYPE html> <html lang=&qu ...

  4. 安装RabbitMQ(二)

    RabbitMQ的简易安装 前一篇博文的RabbitMQ安装有点复杂,经过搜索发现简单的安装方式如下. 1.Erlang Yum Repos 基于 SSL 高版本包含插件 rpm -Uvh http: ...

  5. PLECS—直流电机系统2

    1.模型图 2,计算及仿真 1)计算   2)仿真 n = 1870.1 r/min (wm = 195.833 rad/s)                                     ...

  6. zabbix 3.4.1 解决中文乱码

    docker zabbix中文乱码 基础镜像为:zabbix/zabbix-web-nginx-mysql 1.首先下载msyh.ttf 2.docker cp msyh.ttf 容器:/usr/sh ...

  7. 02-Nginx+MySQL+PHP7

    [安装Nginx] #先安装如下包 yum install gcc gcc-c++ kernel-devel yum -y install pcre-devel openssl openssl-dev ...

  8. PHP将HTML的内容保存成word文档

    <?php class word { function start() { ob_start(); echo '<html xmlns:o="urn:schemas-micros ...

  9. 【ZOJ2760】How Many Shortest Path

    How Many Shortest Path 标签: 网络流 描述 Given a weighted directed graph, we define the shortest path as th ...

  10. yii2 查询构建器

    Query Builder $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name']) ->from('zs_dynast ...