重庆市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

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左