爬取表格类网站数据并保存为excel文件
本文转载自以下网站:50 行代码爬取东方财富网上市公司 10 年近百万行财务报表数据 https://www.makcyun.top/web_scraping_withpython6.html
主要学习的地方:
1.分析网站的ajax请求信息
2.构造参数
3.发起请求后处理获得的数据
4.保存表格
重点:分析表格类网站的ajax请求,以及如何保存这类信息(关于表格方面的)
通过分析网址 JavaScript 请求,以比 Selenium 快 100 倍的方法,快速爬取东方财富网各上市公司历年的财务报表数据。
摘要: 上一篇文章,我们用Selenium成功爬取了东方财富网的财务报表数据,但是速度非常慢,爬取 70 页需要好几十分钟。为了加快速度,本文分析网页JavaScript请求,找到数据接口然后快速爬取财务报表数据。
1. JavaScript请求分析

上一篇文章,我们简单分了东方财富网财务报表网页后台的js请求,文章回顾:(https://www.makcyun.top/web_scraping_withpython5.html)
接下来,我们深入分析。首先,点击报表底部的下一页,然后观察左侧Name列,看会弹出什么新的请求来:

可以看到,当不断点击下一页时,会相应弹出以get?type开头的请求。点击右边Headers选项卡,可以看到请求的URL,网址非常长,先不管它,后续我们会分析各项参数。接着,点击右侧的Preview和Response,可以看到里面有很多整齐的数据,尝试猜测这可能是财务报表中的数据,经过和表格进行对比,发现这正是我们所需的数据,太好了。
然后将URL复制到新链接中打开看看,可以看到表格中的数据完美地显示出来了。竟然不用添加Headers、UA去请求就能获取到,看来东方财富网很大方啊。
到这里,爬取思路已经很清晰了。首先,用Request请求该URL,将获取到的数据进行正则匹配,将数据转变为json格式,然后写入本地文件,最后再加一个分页循环爬取就OK了。这比之前的Selenium要简单很多,而且速度应该会快很多倍。下面我们就先来尝试爬一页数据看看。
2. 爬取单页
2.1. 抓取分析
这里仍然以2018年中报的利润表为例,抓取该网页的第一页表格数据,网页url为:http://data.eastmoney.com/bbsj/201806/lrb.html
表格第一页的js请求的url为:http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get?type=CWBB_LRB&token=70f12f2f4f091e459a279469fe49eca5&st=noticedate&sr=-1&p=2&ps=50&js=var%20spmVUpAF={pages:(tp),data:%20(x)}&filter=(reportdate=^2018-06-30^)&rt=51312886,data:%20(x)}&filter=(reportdate=^2018-06-30^)&rt=51312886)
下面,我们通过分析该url,来抓取表格内容。
| import requests | 
这里我们定义了一个get_table()方法,来输出抓取的第一页表格内容。params为url请求中所包含的参数。
这里对重要参数进行简单说明:type为7个表格的类型说明,将type拆成两部分:’CWBB_‘ 和’LRB’,资产负债表等后3个表是以’CWBB_’ 开头,业绩报表至预约披露时间表等前4个表是以’YJBB20_‘开头的;’LRB’为利润表的首字母缩写,同理业绩报表则为’YJBB’。所以,如果要爬取不同的表格,就需要更改type参数。’filter’为表格筛选参数,这里筛选出年中报的数据。不同的表格筛选条件会不一样,所以当type类型更改的时候,也要相应修改filter类型。
params参数设置好之后,将url和params参数一起传进requests.get()方法中,这样就构造好了请求连接。几行代码就可以成功获取网页第一页的表格数据了:
可以看到,表格信息存储在LFtlXDqn变量中,pages表示表格有72页。data为表格数据,是一个由多个字典构成的列表,每个字典是表格的一行数据。我们可以通过正则表达式分别提取出pages和data数据。
2.2. 正则表达式提取表格
| # 确定页数 | 
这里用\d+匹配页数中的数值,然后用re.search()方法提取出来。group(1)表示输出第一个结果,这里就是()中的页数。
| # 提取出list,可以使用json.dumps和json.loads | 
这里在匹配表格数据用了(.*)表示贪婪匹配,因为data中有很多个字典,每个字典都是以’}’结尾,所以我们利用贪婪匹配到最后一个’}’,这样才能获取data所有数据。多数情况下,我们可能会用到(.*?),这表示非贪婪匹配,意味着之多匹配一个’}’,这样的话,我们只能匹配到第一行数据,显然是不对的。
2.3. json.loads()输出表格
这里提取出来的list是str字符型的,我们需要转换为list列表类型。为什么要转换为list类型呢,因为无法用操作list的方法去操作str,比如list切片。转换为list后,我们可以对list进行切片,比如data[0]可以获取第一个{}中的数据,也就是表格第一行,这样方便后续构造循环从而逐行输出表格数据。这里采用json.loads()方法将str转换为list。
| data = json.loads(data) | 
接下来我们就将表格内容输入到csv文件中。
| # 写入csv文件 | 
通过for循环,依次取出表格中的每一行字典数据{},然后用with…open的方法写入’eastmoney.csv’文件中。
tips:’a’表示可重复写入;encoding=’utf_8_sig’ 能保持csv文件的汉字不会乱码;newline为空能避免每行数据中产生空行。
这样,第一页50行的表格数据就成功输出到csv文件中去了:
这里,我们还可以在输出表格之前添加上表头:
| # 添加列标题 | 
这里,data[0]表示list的一个字典中的数据,data[0].keys()表示获取字典中的key键值,也就是列标题。外面再加一个list序列化(结果如下),然后将该list输出到’eastmoney.csv’中作为表格的列标题即可。
| ['scode', 'hycode', 'companycode', 'sname', 'publishname', 'reporttimetypecode', 'combinetypecode', 'dataajusttype', 'mkt', 'noticedate', 'reportdate', 'parentnetprofit', 'totaloperatereve', 'totaloperateexp', 'totaloperateexp_tb', 'operateexp', 'operateexp_tb', 'saleexp', 'manageexp', 'financeexp', 'operateprofit', 'sumprofit', 'incometax', 'operatereve', 'intnreve', 'intnreve_tb', 'commnreve', 'commnreve_tb', 'operatetax', 'operatemanageexp', 'commreve_commexp', 'intreve_intexp', 'premiumearned', 'premiumearned_tb', 'investincome', 'surrenderpremium', 'indemnityexp', 'tystz', 'yltz', 'sjltz', 'kcfjcxsyjlr', 'sjlktz', 'eutime', 'yyzc'] | 
以上,就完成了单页表格的爬取和下载到本地的过程。
3. 多页表格爬取
将上述代码整理为相应的函数,再添加for循环,仅50行代码就可以爬取72页的利润报表数据:
| import requests | 
整个下载只用了20多秒,而之前用selenium花了几十分钟,这效率提升了足有100倍!
这里,如果我们想下载全部时期(从2007年-2018年)利润报表数据,也很简单。只要将type中的filter参数注释掉,意味着也就是不筛选日期,那么就可以下载全部时期的数据。这里当我们取消注释filter列,将会发现总页数page_all会从2018年中报的72页增加到2528页,全部下载完成后,表格有超过12万行的数据。基于这些数据,可以尝试从中进行一些有价值的数据分析。
4. 通用代码构造
以上代码实现了2018年中报利润报表的爬取,但如果不想局限于该报表,还想爬取其他报表或者其他任意时期的数据,那么就需要手动地去修改代码中相应的字段,很不方便。所以上面的代码可以说是简短但不够强大。
为了能够灵活实现爬取任意类别和任意时期的报表数据,需要对代码再进行一些加工,就可以构造出通用强大的爬虫程序了。
| """ | 
以爬取2018年中业绩报表为例,感受一下比selenium快得多的爬取效果(视频链接):
https://v.qq.com/x/page/a0519bfxajc.html
利用上面的程序,我们可以下载任意时期和任意报表的数据。这里,我下载完成了2018年中报所有7个报表的数据。
文中代码和素材资源可以在下面的链接中获取:
https://github.com/makcyun/eastmoney_spider
爬取表格类网站数据并保存为excel文件的更多相关文章
- python爬取中国天气网站数据并对其进行数据可视化
		网址:http://www.weather.com.cn/textFC/hb.shtml 解析:BeautifulSoup4 爬取所有城市的最低天气 对爬取的数据进行可视化处理 按温度对城市进行排 ... 
- 使用Python爬取微信公众号文章并保存为PDF文件(解决图片不显示的问题)
		前言 第一次写博客,主要内容是爬取微信公众号的文章,将文章以PDF格式保存在本地. 爬取微信公众号文章(使用wechatsogou) 1.安装 pip install wechatsogou --up ... 
- Java爬虫框架WebMagic——入门(爬取列表类网站文章)
		初学爬虫,WebMagic作为一个Java开发的爬虫框架很容易上手,下面就通过一个简单的小例子来看一下. WebMagic框架简介 WebMagic框架包含四个组件,PageProcessor.Sch ... 
- Java爬虫框架WebMagic入门——爬取列表类网站文章
		初学爬虫,WebMagic作为一个Java开发的爬虫框架很容易上手,下面就通过一个简单的小例子来看一下. WebMagic框架简介 WebMagic框架包含四个组件,PageProcessor.Sch ... 
- Python3爬取王者官方网站英雄数据
		爬取王者官方网站英雄数据 众所周知,王者荣耀已经成为众多人们喜爱的一款休闲娱乐手游,今天就利用python3 爬虫技术爬取官方网站上的几十个英雄的资料,包括官方给出的人物定位,英雄名称,技能名称,CD ... 
- Python开发爬虫之BeautifulSoup解析网页篇:爬取安居客网站上北京二手房数据
		目标:爬取安居客网站上前10页北京二手房的数据,包括二手房源的名称.价格.几室几厅.大小.建造年份.联系人.地址.标签等. 网址为:https://beijing.anjuke.com/sale/ B ... 
- Scrapy实战篇(七)之爬取爱基金网站基金业绩数据
		本篇我们以scrapy+selelum的方式来爬取爱基金网站(http://fund.10jqka.com.cn/datacenter/jz/)的基金业绩数据. 思路:我们以http://fund.1 ... 
- Python转页爬取某铝业网站上的数据
		天行健,君子以自强不息:地势坤,君子以厚德载物! 好了废话不多说,正式进入主题,前段时间应朋友的请求,爬取了某铝业网站上的数据.刚开始呢,还是挺不愿意的(主要是自己没有完整的爬取过网上的数据哎,即是不 ... 
- 另类爬虫:从PDF文件中爬取表格数据
		简介 本文将展示一个稍微不一样点的爬虫. 以往我们的爬虫都是从网络上爬取数据,因为网页一般用HTML,CSS,JavaScript代码写成,因此,有大量成熟的技术来爬取网页中的各种数据.这次, ... 
随机推荐
- [PWA] Optimize Assets Delivery using preload and prefetch
			By default, browsers load the assets in a render-blocking way. Modern browsers introduced prefetch a ... 
- 【Git使用具体解释】Egit使用过程中遇到的问题及解决的方法
			1. Git错误non-fast-forward后的冲突解决 问题(Non-fast-forward)的出现原因在于:git仓库中已经有一部分代码,所以它不同意你直接把你的代码覆盖上去.于是你有2 ... 
- js面试题--------JS中数字和字符,布尔类型相加相减问题
			JS中数字和字符相加相减问题 <html lang="en"> <head> <meta charset="utf-8" /> ... 
- CF 557A(Ilya and Diplomas-贪心)
			A. Ilya and Diplomas time limit per test 1 second memory limit per test 256 megabytes input standard ... 
- Windowns 无法启动 Office Software Protection Platform 服务,系统找不到指定的文件
			导致该服务无法启动的原因是,用kms8激活了win7后又用oem8激活试了下,结果就这样,然后就无法激活了,状态ID都不可用.试过禁用计划任务项目,重建MBR,重建PBR,都无效果.最后在这里找到了解 ... 
- B4010 菜肴制作 拓扑排序(附随机跳题代码)
			今天写了一个自己的随机跳题小程序,第一次试发现跳的全是不可做题,但是在周围我一眼看见了这个题,不能说一眼看出来,但是也是比较有思路,所以就做他了! 做得比较顺利,做完之后美滋滋,突然发现样例第三组过不 ... 
- codevs1358棋盘游戏(状压dp)
			1358 棋盘游戏 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description 这个游戏在一个有10*10个格子的棋盘上进行,初 ... 
- css3 文本模型
			我前期是一名前端开发者,经常会遇到关于文本模型的问题,很多地方我们会经常遇到这种问题.例如栏目的标题,在设计师给我们图的时候并不会考虑到标题的长度,所以我们自己开发的过程中自己注意这一点. 首先和大家 ... 
- yaml标记语言的简介
			今天遇到yml这个文件,挺懵的.也是百度了一把. 这篇博文不错:http://www.ibm.com/developerworks/cn/xml/x-1103linrr/ 这图画得不错:http:// ... 
- C#:设置webBrowser框架与系统相对应的IE内核版本
			通常情况下,我们直接调用C#的webBrowser控件,默认的浏览器内核是IE7. 那么如何修改控件调用的默认浏览器版本呢? /// <summary> /// 修改注册表信息来兼容当前 ... 
