重庆市A股上市公司年度财务分析数据爬取

2024-02-02 10:30

本文主要是介绍重庆市A股上市公司年度财务分析数据爬取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.重庆市A股上市公司基本情况

由《重庆上市公司发展报告(2021)》显示,截至12月7日,重庆境内外上市公司数量已达80家。其中,境内上市公司62家,境外上市公司21家(长安汽车为A+B股上市企业,渝农商行、重庆钢铁为A+H股上市企业)。A股上市公司有58家,民营企业有28家,占比48.28%,国有企业24家占比41.38%,还有2家外资企业、2家公众企业、1家其他企业,总达市值1.18万亿,见表1,主要行业包括电子信息、汽车及零部件、高端装备、新材料、生物医药、特色消费品、农副食品等,主要分布见图1。

表 1 重庆市A股上市公司地域分布数据

所在区

经度

纬度

上市公司\家

江北区

106.57

29.6

11

渝北区

106.63

29.72

8

渝中区

106.57

29.55

6

涪陵区

107.4

29.72

5

北碚区

106.4

29.8

5

九龙坡区

106.5

29.5

4

长寿区

107.08

29.87

3

南岸区

106.57

29.52

3

巴南区

106.52

29.38

3

江津区

106.26

29.29

2

璧山区

106.23

29.59

2

万州区

108.4

30.82

1

大渡口区

106.48

29.48

1

合川区

106.27

29.97

1

荣昌区

105.58

29.4

1

垫江县

107.35

30.33

1

图 1 重庆市58家A股上市公司地域位置分布

2.指标的选取

 为了全面真实地反映重庆市A股上市公司综合财务质量的基本情况,本文在收集数据时主要考虑了以下4个方面本文的一级指标:主要经济、盈利能力、偿债能力和成本费用等。每个方面有若干个二级指标数据,一共22个二级指标。利用python爬取重庆上市公司名单-重庆上市公司名录-重庆上市公司大全-商业计划书-可研报告-中商产业研究院数据库-中商情报网上58家A股上市公司的数据

 需要注意的是,要点击每个公司,然后在另一个网页的财务分析(年度)上获取每个指标的数据,如点击渝开发,弹出下一个网页

 在左侧栏目找到财务分析(年度)点击,

注意3次点击网址是不一样,而财务分析(年度)这个网址是我们爬取数据的关键网址。下面展示代码

import requests
from lxml import etree
import time
import pandas as pd
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Optionsurl='https://s.askci.com/stock/a-0-cc0000001429/1/'
opt=Options()
#反爬
opt.add_experimental_option('excludeSwitches', ['enable-automation'])
#无头浏览器
opt.add_argument("--headless")
opt.add_argument("--disable-gpu")
web=Chrome(options=opt)
web.get(url)
stock_list=web.find_elements(By.XPATH,'//*[@id="ResultUl"]/tr/td[2]/a')
stock_code=[]
for code in stock_list:stock_code.append(code.text)#拿到了上市公司的
el=web.find_element(By.XPATH,'//*[@id="kkpager"]/div[1]/span[1]/a[1]')
el.click()
# stock_list1=web.find_elements(By.XPATH,'//*[@id="ResultUl"]/tr/td[2]/a')
# for code in stock_list1:
#     stock_code.append(code.text)#拿到了上市公司的
stock_list1=web.find_elements(By.XPATH,'//*[@id="ResultUl"]/tr/td[2]/a')
for code in stock_list1:stock_code.append(code.text)#拿到了58个上市公司的股票代码
# el=web.find_element(By.XPATH,//*[@id="kkpager"]/div[1]/span[1]/a[1])
# el.click()
# //*[@id="ResultUl"]/tr[1]/td[2]/a
# //*[@id="ResultUl"]/tr[1]/td[2]/a
# //*[@id="ResultUl"]/tr[1]/td[3]/a
# //*[@id="ResultUl"]/tr[2]/td[3]/astock_code=pd.DataFrame(stock_code)
stock_code.columns=['股票代码']#https://s.askci.com/stock/financialanalysis/000514/
eco_name=[]
eco_data=[]
ope_name=[]
ope_data=[]
pay_name=[]
pay_data=[]
cost_name=[]
cost_data=[]
eco_table=[]
ope_table=[]
pay_table=[]
cost_table=[]
for stock in stock_code:url1='https://s.askci.com/stock/financialanalysis/'+stock+'/'opt=Options()opt.add_experimental_option('excludeSwitches', ['enable-automation'])opt.add_argument("--headless")opt.add_argument("--disable-gpu")web=Chrome(options=opt)web.get(url1)print('股票代码{}已打开'.format(stock))
#     web.current_window_handle  # 获取当前窗口
#     web.window_handles    # 获取所有窗口
#     web.switch_to_window(-1)  time.sleep(5)table1=web.find_element(By.XPATH,"//div[@class='right_f_com']//div[2]//table[1]")eco_list=table1.find_elements(By.TAG_NAME,'tr')for eco in eco_list:eco_table.append(eco.text)eco_n=eco_table[0]#主要经济指标的列名包括年份eco_d=eco_table[-1]#主要经济指标的数据eco_name.append(eco_n)eco_data.append(eco_d)time.sleep(1)#拿营业能力指标/盈利能力table2=web.find_element(By.XPATH,"//div[@class='right_f_com']//div[4]//table[1]")ope_list=table2.find_elements(By.TAG_NAME,'tr')for ope in ope_list:ope_table.append(ope.text)    ope_n=ope_table[0]#主要经济指标的列名包括年份ope_d=ope_table[-1]#主要经济指标的数据ope_name.append(ope_n)ope_data.append(ope_d)time.sleep(1)#拿偿债能力指标table3=web.find_element(By.XPATH,"//div[@class='right_f_com']//div[6]//table[1]")pay_list=table3.find_elements(By.TAG_NAME,'tr')for pay in pay_list:pay_table.append(pay.text)    pay_n=pay_table[0]#主要经济指标的列名包括年份pay_d=pay_table[-1]#主要经济指标的数据pay_name.append(pay_n)pay_data.append(pay_d)time.sleep(1)#拿成本费用指标table4=web.find_element(By.XPATH,"//div[@class='right_f_com']//div[8]//table[1]")cost_list=table4.find_elements(By.TAG_NAME,'tr')for cost in cost_list:cost_table.append(cost.text)    cost_n=cost_table[0]#主要经济指标的列名包括年份cost_d=cost_table[-1]#主要经济指标的数据cost_name.append(cost_n)cost_data.append(cost_d)time.sleep(1)print('股票代码{}已运结束'.format(stock))web.close()time.sleep(5)
print('运行完毕')    

以上是咱们把58个上司公司对应指标的数据爬取了出来,接着需要将其数据进行整理,放入CSV中。代码如下

#将得到的数据去空格化,生成对应维度的数据,即样本数x特征数
def data_split(data):new_data=[]for i in range(len(data)):new_data.append(data[i].split(' ')) return new_dataeco_split=data_split(eco_data)#主要经济指标
ope_split=data_split(ope_data)#盈利能力,存货周转率为单位1,应收周转率单位为次,总资产周转率单位为次
pay_split=data_split(pay_data)#
cost_split=data_split(cost_data)#将亿和万转化成亿
def str2value(data):new_data=[]for i in range(len(data)):data_value=[]for value in data[i]:index_yi=value.find('亿')index_wan=value.find('万')index_missing=value.find('--')#缺失标记
#             index_wan_yi=value.find('万亿')if index_yi == -1 and index_wan == -1 and index_missing == -1:#把数字所谓的2020转换成数字2020value=int(value)if index_yi != -1 and index_wan != -1 and index_missing == -1:value=float(value[:index_wan])*10000#把万亿转换成亿if index_yi != -1 and index_wan == -1 and index_missing == -1:value=float(value[:index_yi])#把亿转换成亿if index_wan != -1 and index_yi == -1 and index_missing == -1:value=float(value[:index_wan])*(1e-4)#把万转化成单位为亿的数字if index_missing != -1 and index_yi == -1 and index_wan == -1:value=[]data_value.append(value)new_data.append(data_value)return new_data#主要经济指标的数据
eco=str2value(eco_split)
eco=pd.DataFrame(eco)
eco.columns=['年份','营业收入\亿元','营业利润\亿元','利润总额\亿元','净利润\亿元','资产总计\亿元','负债合计\亿元','股东权益合计\亿元']
print(eco.head())#处理营业能力的净资产收益率的百分号
#在索引为4列
#处理ope_split的
def percentage_num(data):new_data=[]for i in range(len(data)):data_value=[]for value in data[i]:index_percentage=value.find('%')#百分数标记index_point=value.find('.')#小数点标记index_missing=value.find('--')#缺失标记if index_percentage == -1 and index_point == -1 and index_missing ==-1:#转换整数value=int(value)if index_percentage != -1 and index_point !=-1 and index_missing ==-1:#转换百分比的数字value=float(value[:index_percentage])if index_point != -1 and index_percentage == -1 and index_missing ==-1:#转换浮点数value=float(value)if index_missing != -1 and index_percentage == -1 and index_point == -1:value=[]data_value.append(value)new_data.append(data_value)return new_data
#盈利能力(运营能力)
ope=percentage_num(ope_split)
ope=pd.DataFrame(ope)
ope.columns=['年份','销售毛利率\%','营业利润率\%','总资产利润率\%','净资产收益率\%','存货周转率','应收账款周转率\次','总资产周转率\次']
print(ope.head())#偿债能力
pay=percentage_num(pay_split)
pay=pd.DataFrame(pay)
pay.columns=['年份','资产负债率\%','股东权益比率\%','流动比率','速动比率']
print(pay.head())#成本能力
cost=str2value(cost_split)
cost=pd.DataFrame(cost)
cost.columns=['年份','营业成本\亿元','销售费用\亿元','管理费用\亿元','财务费用\亿元']
print(cost.head())
ope.drop(['年份'], axis = 1)
chongqing_A_stock_data=pd.concat([stock_code,eco.drop(['年份'], axis = 1),ope.drop(['年份'], axis = 1),pay.drop(['年份'], axis = 1),cost.drop(['年份'], axis = 1)],axis=1)
chongqing_A_stock_data.to_csv("./重庆A股上市公司.csv", mode='a', index=False, encoding="utf_8_sig")

这样咱们就把所有指标的数据爬取出来了。下面可以考虑通过一些分析方法如主成分分分析、因子分析对各个上市公司计算综合得分,进行质量评价。有空再写

这篇关于重庆市A股上市公司年度财务分析数据爬取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/670415

相关文章

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处