用Python爬取东方财富网上市公司财务报表_东方财富网 舆情评分系统 python代码(1)

做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。

别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。


(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

(4)200多本电子书

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。

基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

(5)Python知识点汇总

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。

在这里插入图片描述

(6)其他资料

还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。

在这里插入图片描述

这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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进行抓取了,方法如下:

 1from selenium import webdriver
 2browser = webdriver.Chrome()
 3# 当测试好能够顺利爬取后,为加快爬取速度可设置无头模式,即不弹出浏览器
 4# 添加无头headlesss 1使用chrome headless,2使用PhantomJS
 5# 使用 PhantomJS 会警告高不建议使用phantomjs,建议chrome headless
 6# chrome_options = webdriver.ChromeOptions()
 7# chrome_options.add_argument('--headless')
 8# browser = webdriver.Chrome(chrome_options=chrome_options)
 9# browser = webdriver.PhantomJS()
10# browser.maximize_window()  # 最大化窗口,可以选择设置
11
12browser.get('http://data.eastmoney.com/bbsj/201806/lrb.html')
13element = browser.find_element_by_css_selector('#dt_1')  # 定位表格,element是WebElement类型
14# 提取表格内容td
15td_content = element.find_elements_by_tag_name("td") # 进一步定位到表格内容所在的td节点
16lst = []  # 存储为list
17for td in td_content:
18    lst.append(td.text)
19print(lst) # 输出表格内容

这里,使用Chrome浏览器构造一个Webdriver对象,赋值给变量browser,browser调用get()方法请求想要抓取的网页。接着使用find_element_by_css_selector方法查找表格所在的节点:‘#dt_1’

这里推荐一款小巧、快速定位css/xpath的Chrome插件:SelectorGadget,使用这个插件就不用再去源代码中手动定位节点那么麻烦了。

插件地址:https://chrome.google.com/webstore/detail/selectorgadget/mhjhnkcfbdhnjickkkdbjoemdmbfginb

紧接着再向下定位到td节点,因为网页中有很多个td节点,所以要用find_elements方法。然后,遍历数据节点存储到list中。打印查看一下结果:

1# list形式:
2['1', '002161', '远望谷', ...'-7960万', '09-29',
3 '2','002316', '亚联发展', ...'1.79亿', '09-29', 
4 '3',...
5 '50', '002683', '宏大爆破',...'1.37亿', '09-01']

是不是很方便,几行代码就能抓取下来这一页表格,除了速度有点慢。

为了便于后续存储,我们将list转换为DataFrame。首先需要把这一个大的list分割为多行多列的子list,实现如下:

 1import pandas as pd
 2# 确定表格列数
 3col = len(element.find_elements_by_css_selector('tr:nth-child(1) td'))
 4# 通过定位一行td的数量,可获得表格的列数,然后将list拆分为对应列数的子list
 5lst = [lst[i:i + col] for i in range(0, len(lst), col)]
 6# 原网页中打开"详细"链接可以查看更详细的数据,这里我们把url提取出来,方便后期查看
 7lst_link = []
 8links = element.find_elements_by_css_selector('#dt_1 a.red')
 9for link in links:
10    url = link.get_attribute('href')
11    lst_link.append(url)
12lst_link = pd.Series(lst_link)
13# list转为dataframe
14df_table = pd.DataFrame(lst)
15# 添加url列
16df_table['url'] = lst_link
17print(df_table.head())  # 查看DataFrame

这里,要将list分割为子list,只需要确定表格有多少列即可,然后将每相隔这么多数量的值划分为一个子list。如果我们数一下该表的列数,可以发现一共有16列。但是这里不能使用这个数字,因为除了利润表,其他报表的列数并不是16,所以当后期爬取其他表格可能就会报错。这里仍然通过find_elements_by_css_selector方法,定位首行td节点的数量,便可获得表格的列数,然后将list拆分为对应列数的子list。同时,原网页中打开"详细"列的链接可以查看更详细的数据,这里我们把url提取出来,并增加一列到DataFrame中,方便后期查看。打印查看一下输出结果:

可以看到,表格所有的数据我们都抓取到了,下面只需要进行分页循环爬取就行了。

这里,没有抓取表头是因为表头有合并单元格,处理起来就非常麻烦。建议表格抓取下来后,在excel中复制表头进去就行了。如果,实在想要用代码完成,可以参考这篇文章:https://blog.csdn.net/weixin_39461443/article/details/75456962

4.3. 分页爬取

上面完成了单页表格的爬取,下面我们来实现分页爬取。

首先,我们先实现Selenium模拟翻页跳转操作,成功后再爬取每页的表格内容。

 1from selenium import webdriver
 2from selenium.common.exceptions import TimeoutException
 3from selenium.webdriver.common.by import By
 4from selenium.webdriver.support import expected_conditions as EC
 5from selenium.webdriver.support.wait import WebDriverWait
 6import time
 7
 8browser = webdriver.Chrome()
 9browser.maximize_window()  # 最大化窗口,可以选择设置
10wait = WebDriverWait(browser, 10)
11def index_page(page):
12    try:
13        browser.get('http://data.eastmoney.com/bbsj/201806/lrb.html')
14        print('正在爬取第: %s 页' % page)
15        wait.until(
16            EC.presence_of_element_located((By.ID, "dt_1")))
17        # 判断是否是第1页,如果大于1就输入跳转,否则等待加载完成。
18        if page > 1:
19            # 确定页数输入框
20            input = wait.until(EC.presence_of_element_located(
21                (By.XPATH, '//*[@id="PageContgopage"]')))
22            input.click()
23            input.clear()
24            input.send_keys(page)
25            submit = wait.until(EC.element_to_be_clickable(
26                (By.CSS_SELECTOR, '#PageCont > a.btn_link')))
27            submit.click()
28            time.sleep(2)
29        # 确认成功跳转到输入框中的指定页
30        wait.until(EC.text_to_be_present_in_element(
31            (By.CSS_SELECTOR, '#PageCont > span.at'), str(page)))
32    except Exception:
33        return None
34
35def main():
36    for page in range(1,5):  # 测试翻4页
37        index_page(page)
38if __name__ == '__main__':
39    main()

这里,我们先加载了相关包,使用WebDriverWait对象,设置最长10s的显式等待时间,以便网页加载出表格。判断表格是否加载出来,用到了EC.presence_of_element_located条件。表格加载出来后,设置一个页面判断,如果在第1页就等待页面加载完成,如果大于第1页就开始跳转。

要完成跳转操作,我们需要通过获取输入框input节点,然后用clear()方法清空输入框,再通过send_keys()方法填写相应的页码,接着通过submit.click()方法击下一页完成翻页跳转。

这里,我们测试一下前4页跳转效果,可以看到网页成功跳转了。下面就可以对每一页应用第一页爬取表格内容的方法,抓取每一页的表格,转为DataFrame然后存储到csv文件中去。

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值