需要学习的地方:
1.Selenium的安装,配置
2.Selenium的初步使用(自动翻页)
利用Selenium爬取东方财富网各上市公司历年的财务报表数据。
摘要: 现在很多网页都采取JavaScript进行动态渲染,其中包括Ajax技术。上一篇文章通过分析Ajax接口数据,顺利爬取了澎湃新闻网动态网页中的图片。但有的网页虽然也Ajax技术,但接口参数可能是加密的无法直接获得,比如淘宝;有的动态网页也采用JavaScript,但不是Ajax技术,比如Echarts官网。所以,当遇到这两类网页时,上一篇文章中的方法便不再奏效,需要新的采取新的方法,这其中包括干脆、直接、好用的的Selenium大法。东方财富网的财务报表网页也是通过JavaScript动态加载的,本文利用Selenium方法爬取该网站上市公司的财务报表数据。
[TOC]
1. 实战背景
很多网站都提供上市公司的公告、财务报表等金融投资信息和数据,比如:腾讯财经、网易财经、新浪财经、东方财富网等。这之中,发现东方财富网的数据非常齐全。
东方财富网
有一个数据中心:http://data.eastmoney.com/center/,该数据中心提供包括特色数据、研究报告、年报季报等在内的大量数据(见下图)。
以年报季报类别为例,我们点开该分类查看一下2018年中报(见下图),可以看到该分类下又包括:业绩报表、业绩快报、利润表等7个报表的数据。以业绩报表为例,报表包含全部3000多只股票的业绩报表数据,一共有70多页。
假如,我们想获取所有股票2018年中的业绩报表数据,然后对该数据进行一些分析。采取手动复制的方法,70多页可以勉强完成。但如果想获取任意一年、任意季度、任意报表的数据,要再通过手动复制的方法,工作量会非常地大。举个例子,假设要获取10年间(40个季度)、所有7个报表的数据,那么手动复制的工作量大约将是:40×7×70(每个报表大约70页),差不多要重复性地复制2万次!!!可以说是人工不可能完成的任务。所以,本文的目标就是利用Selenium自动化技术,爬取年报季报类别下,任意一年(网站有数据至今)、任意财务报表数据。我们所需要做的,仅是简单输入几个字符,其他就全部交给电脑,然后过一会儿打开excel,就可以看到所需数据”静静地躺在那里”,是不是挺酷的?
好,下面我们就开始实操一下。首先,需要分析要爬取的网页对象。
2. 网页分析
之前,我们已经爬过表格型的数据,所以对表格数据的结构应该不会太陌生,如果忘了,可以再看一下这篇文章:https://www.makcyun.top/web_scraping_withpython2.html
我们这里以上面的2018年中报的业绩报表为例,查看一下表格的形式。
网址url:http://data.eastmoney.com/bbsj/201806/lrb.html,bbsj
代表年报季报,201803
代表2018年一季报
,类似地,201806表示年中报;lrb
是利润表
的首字母缩写,同理,yjbb
表示业绩报表
。可以看出,该网址格式很简单,便于构造url。
接着,我们点击下一页
按钮,可以看到表格更新后,url没有发生改变,可以判定是采用了Javscript。那么,我们首先判断是不是采用了Ajax加载的。方法也很简单,右键检查或按F12,切换到network并选择下面的XHR,再按F5刷新。可以看到只有一个Ajax请求,点击下一页也并没有生成新的Ajax请求,可以判断该网页结构不是常见的那种点击下一页或者下拉会源源不断出现的Ajax请求类型,那么便无法构造url来实现分页爬取。
XHR选项里没有找到我们需要的请求,接下来试试看能不能再JS里找到表格的数据请求。将选项选为JS,再次F5刷新,可以看到出现了很多JS请求,然后我们点击几次下一页,会发现弹出新的请求来,然后右边为响应的请求信息。url链接非常长,看上去很复杂。好,这里我们先在这里打住不往下了。
可以看到,通过分析后台元素来爬取该动态网页的方法,相对比较复杂。那么有没有干脆、直截了当地就能够抓取表格内容的方法呢?有的,就是本文接下来要介绍的Selenium大法。
3. Selenium知识
Selenium 是什么?一句话,自动化测试工具。它是为了测试而出生的,但在近几年火热的爬虫领域中,它摇身一变,变成了爬虫的利器。直白点说, Seleninm能控制浏览器, 像人一样”上网”。比如,可以实现网页自动翻页、登录网站、发送邮件、下载图片/音乐/视频等等。举个例子,写几行python代码就可以用Selenium实现登录IT桔子,然后浏览网页的功能。
怎么样,仅用几行代码就能实现自动上网操作,是不是挺神奇的?当然,这仅仅是Selenium最简单的功能,还有很多更加丰富的操作,可以参考以下几篇教程:
参考网站:
Selenium官网: https://selenium-python.readthedocs.io/
SeleniumPython文档(英文版):http://selenium-python.readthedocs.org/index.html
SeleniumPython文档(中文版):https://selenium-python-zh.readthedocs.io/en/latest/faq.html
Selenium 基本操作:https://www.yukunweb.com/2017/7/python-spider-Selenium-PhantomJS-basic/
Selenium爬取淘宝信息实战:https://cuiqingcai.com/2852.html
只需要记住重要的一点就是:Selenium能做到"可见即可爬"
。也就是说网页上你能看到的东西,Selenium基本上都能爬取下来。包括上面我们提到的东方财富网的财务报表数据,它也能够做到,而且非常简单直接,不用去后台查看用了什么JavaScript技术或者Ajax参数。下面我们就实际来操练下吧。
4. 编码实现
4.1. 思路
- 安装配置好Selenium运行的相关环境,浏览器可以用Chrome、Firefox、PhantomJS等,我用的是Chrome;
- 东方财富网的财务报表数据不用登录可直接获得,Selenium更加方便爬取;
- 先以单个网页中的财务报表为例,表格数据结构简单,可先直接定位到整个表格,然后一次性获取所有td节点对应的表格单元内容;
- 接着循环分页爬取所有上市公司的数据,并保存为csv文件。
- 重新构造灵活的url,实现可以爬取任意时期、任意一张财务报表的数据。
根据上述思路,下面就用代码一步步来实现。
4.2. 爬取单页表格
我们先以2018年中报的利润表
为例,抓取该网页的第一页表格数据,网页url:http://data.eastmoney.com/bbsj/201806/lrb.html
快速定位到表格所在的节点:id = dt_1,然后可以用Selenium进行抓取了,方法如下:
from selenium import webdriver |