投稿  收藏 
取得上市公司的商誉占比

【问题描述】

编写Python程序,通过金融界网站爬取50个公司的商誉占比(商誉占比=商誉/总资产),并测试爬取商誉占比的用时。某上市公司的资产负债表和其商誉、资产总计数据如图8-1-1和图8-1-2所示。

取得上市公司的商誉占比

图8-1-1 金融界网站上某公司的资产负债表

取得上市公司的商誉占比

图8-1-2 资产负债表中商誉和资产总计所在的位置

取得上市公司的商誉占比输出结果:

运行1次get_all函数花费时间:4.339382648468018秒

取得上市公司的商誉占比

【题前思考】

根据问题描述,填写表8-1-1。

表8-1-1 问题分析

取得上市公司的商誉占比

【解题思路】

定义爬取商誉信息的函数get_proportion_of_goodwill( ),负责获取某个公司的商誉信息。函数首先运用requests模块获取资产负债表网页的全部内容,然后运用xpath从中提取公司名称、商誉、总资产,再计算出商誉占比,最后将获得的数据以字典类型返回。主要流程如图8-1-3所示。

取得上市公司的商誉占比

图8-1-3 爬取公司商誉占比的主要流程

在程序中,使用for循环依次调用get_proportion_of_goodwill函数,获取每个公司的商誉占比数据并存入列表res中,最后格式化输出res。

使用项目五中定义的函数修饰器@timeit计算出爬取商誉占比的总用时。

【参考代码】

取得上市公司的商誉占比

【代码分析】

①:从项目五编写的“a5_3_2检测函数运行时间”模块中导入函数运行计时修饰器timeit用于检测函数运行时间。

②:定义函数toFloat( )用于将字符串表示的金额转换为实型数据。例如,“3,287,9.2”转换成32879.2,“1,556,35.25万”转换成1556352500.0。

③:定义函数get_proportion_of_goodwill( )爬取股票代码company_code代表的公司的财务数据。此例只爬取公司名称、商誉、总资产3项内容,返回结果为一个列表,各项内容分别为[company_code(股票代码)、company_name(公司名称)、goodwill(商誉),total_assets(总资产)、goodwill/total_assets(商誉占比)]。

④:表示运用requests模块的get( )函数下载网页中的内容,返回结果存入content变量。get( )方法返回一个Response类的对象代表Web服务器的响应数据,Response.content代表网页的内容。

⑤:调用etree.HTML( )函数对获取的内容进行解析,解析结果是lxml.etree._Element类表示的根节点,将其存放到变量tree中。lxml.etree._Element类表示HTML文档中的一个节点,并提供了丰富的节点检索方法。

⑥:从网页中提取公司名称并存入company_name变量中。_Element类的xpath( )方法使用xpath表达式检索网页中的内容。

公司名称在HTML中的位置如下,必须联系HTML结构来理解xpath表达式。

取得上市公司的商誉占比

以上代码中,<>括起来的内容称为标签,标签中如class="sname"的表达式里,class是属性,“sname”是属性值。外面的标签称为祖先,里面的标签称为子孙,同一级的标签称为兄弟。例如,<div>是<h3>和<a>的祖先,<h3>和<a>是<div>的子孙,<div>是<h3>的父亲,<h3>是<div>的儿子,而<a>和<p>是兄弟。

xpath表达式//div[@class="sname"]表示当前节点的子孙节点中class属性值为sname的div节点。xpath表达式//div[@class="sname"]/h3/a/text( )表示找到满足上述要求的div节点后,再查询它的子节点h3,再查找h3节点的子节点a,然后再用text( )函数取得a节点里面的文字。因为满足xpath表达式要求的值可能会有多个,所以xpath函数的返回值是一个列表,于是用下标0表示列表中的第1个值。

⑦:从资产负债表中获取商誉。商誉这一行数据的HTML代码如下:

取得上市公司的商誉占比

取得上市公司的商誉占比

通过网页源代码分析得出,商誉的值是“82,603.87万”,正好在“商誉”单元格的下一个单元格中。"//td[contains(text( ),'商誉')]/following-sibling::td[1]"表示含有(contains( )方法)“商誉”(text( )方法)的td标签后的第一个兄弟td标签(following-sibling::td[1])。因为表达式最后指向的是节点,所以xpath返回值就是节点的列表。取列表中的第1个节点中的文字(text属性)就得到商誉的值。

⑧:获取总资产。总资产这一行数据的HTML代码如下:

取得上市公司的商誉占比

通过网页源代码分析得出,总资产的值为“2,315,582.66万”,正好在“资产总计”单元格的下一个单元格中。

⑨:定义函数get_all( )用于爬取股票代码列表stock_list中所有公司的商誉占比数据。@timeit(1)是在项目五中定义的函数修饰器,用于检测函数的运行时间,参数1表示只运行1次函数。从函数体代码可知,最后列表会按商誉占比降序排列。

⑩:chr(12288)表示中文空格,使用这个字符是要解决中文字符宽度大于西文字符宽度导致不能对齐的问题。因为公司名称字数不同,采用西文空格来填充又与中文字符宽度不一致,导致文本不能对齐,使用中文空格来填充就能解决这一问题。

【技术全貌】

1.使用requests爬取网页

requests是网页爬虫利器,支持HTTP连接保持和连接池、cookie保持、会话、文件上传和自动确定响应内容的编码等。requests库提供多种请求方法,见表8-1-2。

表8-1-2 requests常用网页请求方法

取得上市公司的商誉占比

续表

取得上市公司的商誉占比

2.使用xpath解析网页

xpath是重要的网页解析工具,其功能是解析网页,提取符合路径表达式规则的网页内容。使用xpath获取网页数据的一般方法如下:

content=requests.get(url).content#请求网页内容

tree=etree.HTML(content)#解析HTML代码返回根节点

节点.xpath(xpath表达式)#使用xpath表达式选取网页内容

xpath表达式的规则及用法见表8-1-3。

表8-1-3 xpath路径表达式规则

取得上市公司的商誉占比

续表

取得上市公司的商誉占比

续表

取得上市公司的商誉占比

关 键 词

商誉占比

相关教程

提示声明

  • 免责声明:本站资源均来自网络或者用户投稿,仅供用于学习和交流:如有侵权联系删除!

猜你喜欢