实训可视化项目小结 --- 开启Python初始之旅

Python初试感悟

语言之间是相通的,大多数时候,百分之八十的问题,都可以用常用的容器以及内置函数来辅助解决。之前从未认真接触过Python,但此次学校实训要求使用Python做一个可视化,东西不难,我个人负责爬虫部分的编写。

学习步骤:

  1. 学会常用的容器和基本函数,以及爬虫需要用到的库
  2. 学习爬虫的原理和流程
  3. 尝试多次练习,熟练爬虫的过程和细节.
  4. 在解决问题中接触学习更多的细节问题

个人感悟:

  • 语言之间互通。起码在容器,面向过程这些基本的每门编程语言必备的语法traits上是一致的。
  • 再往上走的面向对象设计编程呀,并发呀。更多的语法糖。可以慢慢来,学习这些东西嘛,可以需要用到时深入了解和总结使用是最好的。毕竟语法糖是学不完的。学过C++的应该都有此感想。更何况如今有了只能AI,chat,这可以更方便的辅助我们,减少人脑对于一些庞大繁杂知识的容量。而更多的积累整体框架,弱化细节,更具整体的一个把握性。
  • 然后自然是了解Python的开发工具以及必备库...  (Python的库是辅助每个方向的开发的,像我这次使用爬虫,自然需要用到他的web访问请求相关的库。)
  • 然后对比C++和Python. 的确,完全不可否认,诸如Python此类的语言,各种开发方向的生态极其完善。几乎每一步应该怎么做都可以有库作为辅助。我们更多的可以集中在整体的设计,以及过程中细节问题的解决上。  而C++ ,我的认知也很有限,但是对比Python和C++程序跑起来的速度。个人感觉C++的的确确是快上很多。但是两种语言实用范围完全不相同。C++还是更为适合做底层的架子。高性能的框架等一些方面,至于业务,我个人没有工作经验,所以没有发言权。
  • 个人得出结论。利用语言的互通有无,对比学习,我们完全有能力在很短的时间内掌握其他门的语言,所以可以更为集中在行业的方向上。而且对语言也无需害怕恐惧,或者排斥,无非,我上手他们不就是一些常用的容器,以及各种内置类对象和基础的对象定义,函数申明,循环,判断等等而已。剩下的更多,随着不断的练习,自然可以掌握

Python 基础语法

对象定义:无需指定类型,根据赋值来自动确定对象的类型。

输入输出:采用 input()和print(); 做格式化输入,输出

# python 中的输入函数input

# 变量名 = input("输入的提示")

# python 中的打印函数(格式化输出)

# pinrt ('辅助内容,%s', %变量名)

案例

然后,思考问题。发现input输入,默认是字符串类型,所以如果需要获取整形数据需要我们类型转换

name  = input("what's your name? ")

age = int(input("What's your age? "))
# age = input("What's your age? ") 错误方式,获取的是%s的age
print("hello,%s" %name)
print("hello,%s years: %d" %(name, age))

逻辑判断:对比发现,Python中的 if 判断不需要用{}来限定区域,而是通过缩进一致保持同一个代码块的判断. 

# if expression:

#     操作

# elif expression:

#     操作

# else:

#     操作

score = int(input('请输入你的成绩:'))
if score >= 90:
    print('考的不错喔, 优秀')
elif score >= 60: 
    print('还可以,及格了')
else:
    print('小垃圾,没及格')

循环遍历操作  for in range(范围)  用到比较多。遍历容器跟C++迭代器很像,连开闭区间都互通,两者maybe底层一致。

第一种

# for num in 范围:

#     操作

# range(begin, end, interval/gap)

# [begin, end)

第二种:

for value in 容器:

        操作

sum = 0
for number in range(0, 10):
    sum = sum + number
print(sum)
# 从1累加到9
sum = 0
num = 1
while num < 11:
    sum += num
    num += 1
print(sum)

注:另一个小区别,Python力求精简,中间很多的像是判断条件的()包裹。。。给去除掉了。显得代码更为简洁,明了

常用数据结构

列表(对应数组) [] 元组(), 字典(对应map和hashTB), 集合(对应set), 从set变来

python 中

列表就是C/C++中的数组

定义就是

列表名 = [元素]

append方法:尾部插入一个元素

列表名.append(元素)

len方法:获取列表长度

len(列表名)

insert方法: 某一下标位置插入元素

inset(iterater/ind, 元素)

pop方法:尾部删除一个元素

列表名.pop()

其实按道理,只要懂得这个对应类对象的定义即可。具体的方法调用都会有提示。方法名也都大差不差。append追加用的多。具体位置插入用的都很少。跟咱刷题用C++, push_back用的多一个道理。插入删除中间元素是不效率不太好。

python中定义一个字典,也就是map或者hashTB

字典名={键:值, 键:值...}

字典插入元素

字典名[新键名] = 值

字典名.pop(键) 删除键对应元素.

print(键 in 字典) 判断字典中是否存在这个键

获取键对应的值

字典名.get(键)

看到字典,我想它的重要程度不言而喻,不管任何语言中都属于最最常用的数据结构,没有之一。它的键值对,可以帮助我们快速检索。而且很多数据的序列化格式就是字典形式。比如说Json。而且字典也是一种特别清晰明了的展开格式。很方便我们人来阅读,以及适合网络传输。

是的,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,通常用于将数据从服务器传输到客户端。它使用键值对的形式来组织数据,并且可以嵌套多个键值对形成复杂的数据结构。因此,可以说JSON是一种字典形式组织的数据。(剥洋葱,剥菜心。一层一层的剥开里面的data)

集合名 = set([列表]), 集合是在列表的基础上完成的,set(列表)强转

add

remove

整的挺好,没有再多加别的类型标识符进来,直接复用了[]套个set转换。

# def addone(score):

#     return score + 1

# print(addone(99))

'''

最后python的函数命名:

def 函数名(参数名):

    函数体

    return 返回值

'''
 

'''

求 1+3+5+7+…+99 的求和,用 Python 该如何写?

'''

# sum = 0

# num = 1

# while num < 100:

#     sum += num

#     num += 2

# print(sum)

Python爬虫

说的通俗一点吧:就是模拟浏览器访问web服务器的的过程,骗过服务器,爬取到服务器上面的数据并且返回回来。

爬:是真的很简单,难的是爬那里,爬回来之后数据咋做处理,咋个提取出有效数据,或者说我们需要的数据。

下面是找的比较合理的官方的一些定义,以及小杰做的一点笔记。

什么是爬虫?

请求网页并提取数据的自动化程序.

爬虫的基本流程

  1. 发起请求

    通过HTTP库目标站点发起请求, 即发送一个Request, 请求需要包含Header信息(user-agent), 以便服务器识别同意请求.

  2. 获取响应

    通过request的返回值获取response响应, response响应中包含html, Json字符串, 二进制数据(入图片视频) 等类型

  3. 解析内容

    得到的可能是html, 可以用xpath网页解析库进行网页解析, 可能是Json, 转成Json对象解析, 也可能是二进制数据

  4. 保存数据

    保存到数据库, 或者特定格式文件中.

Header信息(请求头部信息)

供服务器检查的信息. (Python中通常是User-Agent),如果不携带, 服务器可能默认是是爬虫等其他陌生客户端访问给拒绝掉.

分析页面

分析我们需要爬取的页面中包含的信息. 打开google或者其他浏览器访问到对应网页。点击F12, 会出现如下一个窗口,其中比较重要的两个就是Element和Network了。一个就是网页的源代码, 另外一个就是发送的网络请求。在网络请求中就可以看见我们需要的User-Agent信息。帮助我们伪装成浏览器访问,一般不太反爬虫的服务器就可以访问成功.

 网页组成成分:

  • CSS : 美化,美容

  • HTML :骨架,框架

  • js :动态,动画,动作

XPath:

XPath 是 XML的路径语言, 实际上通过元素和属性导航, 帮我们定位位置. 使用 XPath 定位,你会用到 Python 的一个解析库 lxml。(核心:lxml库的使用方式)

 id:唯一选择器 class:(也可选择)但不具备唯一性

过程代码化

访问过程:

# 引入requests库, 对服务器做访问
import requests

# 设置HTTP请求header
header={键:值, 键:值...}
# 设置网址, 定位服务器
url = "" 
# 模拟Get访问,并且获取响应报文response
response = requests.get(url, header)
# 打印一下返回状态,看看是否访问成功
print(response.status_code)

对返回数据中的有效数据定位过程,数据解析过程

我只学了两种数据的解析和定位,一种是HTML,另外一种是Json, 说白了就是静态的那点东西。

response.text 
#也就是爬取的正文内容了, 但是有时候二进制流解析过来是乱码
# 编码方式不匹配的问题
# soso 使用 content
resp_content = response.content.decode(解编码类型)

解析HTML内容

  • 方式1: 采用lxml库中的xpath做元素定位. 
  • 键html字符串文本转变为etree结点对象,方便定位。这个对象maybe底层是树形结构啥的。反正处理html的内容定位很方便。
from lxml import etree   #解析html或者xml

html = etree.HTML(resp_content)
# // 模糊匹配, 定位大致范围, 子孙均可 /明确下一级。只能是儿子标签.
html.xpath('定位规则')
html.xpath('//div[@id = "content"]/a/text()')
定位所有的div标签下面的id = content的div标签下面的所有a标签下面的text()标签文本数据

  • 方式2:采用re正则表达式库做数据定位处理
import re
pat = re.compile('<li class=" j_thread_list clearfix thread_item_box".*?<a rel="noopener".*?href="(.*?)".*?title="(.*?)".*?', re.S)
result = re.findall(pat, content)

.*? 匹配任意,老实说这种正则定位方式确实强大,但是我每太学会。不过需要用的时候可以去查,网上总有别人写了现成的匹配方式。我们只需要改很小一部分即可。

解析Json内容

这个最简单,不容质疑。

# 现如今拥有的是resp_content, 是字符串.
# 但是确实满足键值对关系的字符串

# 但是,字符串都不够好处理呀。想象一下从臃肿的字符串中切割键值对还是麻烦喔。
# 要是是一个字典容器。键值不要太安逸

# 所以呀万能的Python牛人必然要开发一个json库出来将Json串数据转换为对应的数据结构来方便咱们用呀

# 怎么剥洋葱,看下一层,是字典就拨开字典,是列表就拨开列表。直至拨到数据为止

import json

data_container = json.loads(resp_content)
# 接着简单,剥洋葱。

扒衣服例子eg:

# dict 扒衣服

# list中是字典
rankings_list = dict_content["data"]["rankings"]

for value in rankings_list:
    print(value["univNameCn"]+":"+value["ranking"])

具体的实际案例:

实践过程中的一个经验,翻页啥的,或者网页嵌套啥的,都知识尾部后缀suffix做改变,所以我们可以将嵌套网页后缀搞个数组,或者是搞个翻页+= 多少啥的来处理

eg1:  爬取百度贴吧lol吧留言:

# 贴吧
# https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0
# https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50
import re
import requests
import json

tiebaName = 'lol'
basic_url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}"

headers = {
    "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
}

# 构造五页的数据
for i in range(5):
    url = basic_url.format(tiebaName, i*50)
    response = requests.get(url, headers)
    content = response.content.decode('UTF-8') 
    pat = re.compile('<li class=" j_thread_list clearfix thread_item_box".*?<a rel="noopener".*?href="(.*?)".*?title="(.*?)".*?', re.S)
    result = re.findall(pat, content)
    # print(result)
    for value in result:
        print("https://tieba.baidu.com"+value[0])
        print(value[1])

eg2: 爬取一个Json格式网页的中国大学排名

#导入第三方库
import pymysql
import random
import json

import requests  #发送请求
from lxml import etree   #解析html或者xml

#url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token='
url = 'https://www.shanghairanking.cn/api/pub/v1/bcur?bcur_type=11&year=2020'


# user-agent列表,用于构造随机取值

header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
}
resp1 = requests.get(url, header)
#print(resp1.text)
dict_content = json.loads(resp1.content)
print(type(dict_content))
# dict 扒衣服

# list中是字典
rankings_list = dict_content["data"]["rankings"]

for value in rankings_list:
    print(value["univNameCn"]+":"+value["ranking"])

eg3: 项目,我做的部分,爬取每一科目的每一个大学的对应排名

import requests
import re
from lxml import etree   #解析html或者xml
import pymysql

headers = {
    "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
}

url = "https://www.shanghairanking.cn/rankings/bcsr/2022"

response = requests.get(url, headers)

text_content = response.content.decode('UTF-8') 

html = etree.HTML(text_content)
def is_number(input_string):
    try:
        float(input_string)
        return True
    except ValueError:
        return False



info = html.xpath('//div[@id="__nuxt"]//span/text()')
suffix_list = []
subject_info_list = []
i = 2
while i < len(info):
    if (is_number(info[i])):
        if (len(info[i]) > 2):
            suffix_list.append(info[i])
            i += 1
            subject_info_list.append(info[i])
    i += 1
# print(subject_info_list)
# print(suffix_list)

basic_url = "https://www.shanghairanking.cn/rankings/bcsr/2022/"


connection = pymysql.connect(host="", user="", passwd=""
                 , database="visualize", charset="utf8")
# 创建游标
curoser = connection.cursor()


sql = 'insert into subject_school_rank values(%s, %s, %s)'

for i in range(len(suffix_list)):
    value = suffix_list[i]
    url = basic_url + value
    # print(url)
    response = requests.get(url, headers)
    text_content = response.content.decode('UTF-8') 
    html = etree.HTML(text_content)
    rank_info = html.xpath('//div[@id="content-box"]//div[@class="ranking"]/text()')
    univ_name_info = html.xpath('//div[@class="logo"]/img/@alt')
    univ_rank_info = []
    for value in rank_info:
        value = re.sub("\D", "", value)
        univ_rank_info.append(value)
    # print(univ_name_info)
    # print(univ_rank_info)
    # print(len(univ_name_info))
    # print(len(univ_rank_info))
    curoser.execute(sql, (subject_info_list[i], univ_name_info[0], univ_rank_info[0]))
    for j in range(len(univ_rank_info)):
        curoser.execute(sql, (subject_info_list[i], univ_name_info[j], univ_rank_info[j]))
        j += 1
    i += 1
    print(i)




#编写 sql 语句
# sql = 'insert into school values(%s, %s, %s, %s)'
# for ind in range(len(univ_score)):
#      result = curoser.execute(sql, (univ_rank[ind], univ_name[ind], univ_score[ind], univ_type[ind]))
# print("死循环啦?")
connection.commit()
curoser.close()
connection.close()   

Python数据库操作

# 导入库
import pymysql
# 连接数据库
connection = pymysql.connect(认证参数。。。)
数据库嘛都是那点参数
ip:
user:
port:
passwd:
# 创建游标,python中依赖游标执行sql
curoser = connection.cursor()
# 编写sql
sql = 'insert into subject_school_rank values(%s, %s, %s...)'
# 执行操作 (注意,以元组形式打包插入)
curoser.execute(sql, (元组数据))
# 提交操作
connection.commit()
# 关闭数据库和游标
curoser.close()
connection.close()   

Python学习的必要性  --- 个人浅显认知

Python学习成本相较于Java和C++更低,而且如果读研,到了实验室绝对要用。它可以帮助我们在C++难以快速深入和触及的方向让我们对一个项目,前后端呀感受的更多。而且它用来写个脚本,做个可视化。写个爬虫,部署一个框架,搭建服务器。都是非常的方便。学习,术业有专攻,方向要专一自然不错。但是如果有一颗包容的心,不畏惧新的东西,去学他。其实最后发现是可以学会的。也并没有我们想象的那么神秘。               -----  最后祝大家天天开心,多锻炼身体,IT的学习枯燥,我们更要注重身体的保养。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/23961.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop学习---8、Hadoop数据压缩

1、Hadoop数据压缩 1.1 概述 1、压缩的好处和坏处 &#xff08;1&#xff09;优点&#xff1a;减少磁盘IO、减少磁盘储存空间 &#xff08;2&#xff09;缺点&#xff1a;增加CPU开销 2、压缩原则 &#xff08;1&#xff09;运算密集型的Job&#xff0c;少用压缩 &#xff08…

【2023 · CANN训练营第一季】应用开发(初级)第四章——模型推理

AscendCL运行资源管理 申请运行管理资源时&#xff0c;需按顺序依次申请: Device、Context、Stream&#xff0c;然后根据实际需求调用aclrtGetRunMode接口获取软件栈的运行模型(当同一个应用既支持在Host运行&#xff0c;也支持在Device运行时&#xff0c;在编程时需要就需要根…

Shap-E:3D资产的生成式AI大模型

OpenAI 刚刚发布了 Shap-E&#xff0c;这是一种基于文本提示和图像创建 3D 资产的生成模型&#xff0c;能够生成带纹理的网格和神经辐射场 &#xff0c;从而实现各种 3D 输出。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 在本教程中&#xff0c;我们将引导你在 Go…

嵌入式软件测试笔记2 |TEmb方法概述

2 |TEmb方法概述 1 TEmb简介2 TEmb工作原理3 系统特性4 TEmb通用元素4.1 生命周期4.2 技术4.3 基础设施4.3.1 测试环境4.3.2 工具和测试自动化4.3.3 办公环境 4.4 组织 5 组合专用测试方法的机制5.1 常用系统特性5.2 特定方法5.3 LITO矩阵 1 TEmb简介 TEmb是一种方法&#xff…

Rocksdb相关学习

1 Basic Operations 先介绍一些 RocksDB 的基本操作和基本架构。 1.1 LSM 与 WriteBatch 参考文档5提到RocksDB 是一个快速存储系统&#xff0c;它会充分挖掘 Flash or RAM 硬件的读写特性&#xff0c;支持单个 KV 的读写以及批量读写。RocksDB 自身采用的一些数据结构如 LSM/…

picoctf_2018_rop chain

小白垃圾笔记&#xff0c;不建议阅读。 这道题目其实我是瞎做的. 本地调试需要写一个文件名为flag.txt的文件。 先检查下保护&#xff1a;&#xff08;我把文件名改成pwn了&#xff09;&#xff0c;32位仅仅开启了nx 然后放到32位ida里&#xff1a; main函数如下&#xff1a…

全网最火爆,从接口测试到接口自动化测试总结,卷王进阶高级...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python接口自动化测…

element-ui菜单el-menu的使用

效果演示 先给大家看一下效果吧 el-menu详解 Menu Attributes# 属性名说明类型可选值默认值mode菜单展示模式stringhorizontal / verticalverticalcollapse是否水平折叠收起菜单&#xff08;仅在 mode 为 vertical 时可用&#xff09;boolean—falseellipsis是否省略多余的子项…

软件测试之自动化测试详解

文章目录 一.前言二.selenium介绍三.selenium的组成部分四.Selenium的环境搭建下载浏览器配置环境变量验证环境是否搭建成功 五.Selenium的API打开浏览器元素的定位操作测试对象等待操作信息获取鼠标操作键盘操作选项操作浏览器操作 六.需要用到的包 一.前言 自动化测试指软件…

SQL面试必备:100道高频考题解析

前言 在众多IT职场中&#xff0c;SQL技术一直是一个非常重要的技能点。如果你正在准备SQL相关的面试&#xff0c;那么这份“SQL面试 100 问”绝对是你不能错过的宝藏&#xff01; 这份清单涵盖了100道高频考题&#xff0c;从基础知识到复杂应用都有所涉及&#xff0c;帮助你全…

树莓派485转USB串口调试教程

步骤1&#xff1a;接线方式&#xff1a;485转USB 注意接线口是否对应&#xff1a;A1B1 步骤2&#xff1a;查看串口配置—映射关系是否正确 命令&#xff1a;ls -l /dev serial0即GPIO映射的串口&#xff0c;默认是ttyS0&#xff0c;即mini串口 serial1即板载蓝牙映射的串口&am…

关于原生feign发起请求时,参数注解的相关问题

先说结论&#xff1a; POST请求必须指定请求头&#xff0c;body参数用RequestBody或者Param&#xff08;需要一个一个写&#xff09;。 GET请求&#xff0c;传参只能用QueryMap&#xff0c;后边变量是Map形式&#xff0c;哪怕是一个参数也必须放到map里边。如果是路径变量&…

Java 集合中 ArrayList 的扩容机制原理(面试+读源码)

在 Java 中&#xff0c;ArrayList 内部是通过一个数组来存储元素的&#xff0c;是一个数组结构的存储容器。当向一个 ArrayList 中添加元素时&#xff0c;如果当前数组已经满了&#xff0c;就需要扩容。 集合的继承关系图 一、面试回答 ( ArrayList 的扩容机制原理 ) 面试…

Solidity基础六

生活本来就是平凡琐碎的&#xff0c;哪有那么多惊天动地的大事&#xff0c;快乐的秘诀就是不管对大事小事都要保持热情 目录 一、Solidity的特殊变量(全局) 二、Solidity的不可变量 immutable的赋值方式 三、Solidity的事件与日志 事件和日志加深理解 四、Solidity的异常…

ChatGPT1论文解读《Improving Language Understanding by Generative Pre-Training》

论文总结 以下是我阅读完整篇论文做的个人总结&#xff0c;基本包含了chatGPT1设计的完整框架思路&#xff0c;可以仅看【论文总结】章节。 在GPT1实现的核心架构中&#xff0c;包含两个阶段。 第一阶段 在第一阶段基于一个包含7000本书籍内容的海量未标注文本数据集进行无…

注解-反射-XML配置原理

java刚开始原本是直接在方法中创建对象执行程序等&#xff0c;部分代码重复率高&#xff0c;后来就发展成方法封装调用&#xff0c;再后来出现的像spring框架等&#xff0c;引入了XML配置&#xff0c;使得程序更加简洁&#xff0c;方便等&#xff0c;其中XML配置也是基于java反…

java+iClientOpenlayers实现污水排放扩散模拟(湖库污染排放扩散模拟)

软件实现效果 一、应用背景 湖库污染是一个日益严峻的环境问题。随着城市化和工业化的加速发展&#xff0c;越来越多的有害物质被排放入湖库中&#xff0c;导致湖库污染加剧并扩散到周围地区。本文将探讨湖库污染扩散的原因、影响和解决方法。 首先&#xff0c;湖库污染扩散的…

堆排序之——TopK问题

思维导图&#xff1a; 一&#xff0c;TopK算法的运用 TopK的算法在我们的日常生活中可谓是大有用处&#xff0c;比如你在点外卖时外卖榜单上的销量前几名的筛选&#xff0c;富豪排行榜的榜单人物的筛选&#xff0c;游戏排位……等等领域都会有TopK算法的涉及。TopK问题的用处可…

github创建仓库和拉取代码

目录 一、git创建仓库 第一步&#xff1a;首先登录github 第二步&#xff1a;进入建立的仓库(或者新建仓库) 第三步&#xff1a;创建成功 第四步&#xff1a;在本地新建一个文件夹&#xff0c;然后在文件夹下打开git bash 第五步&#xff1a;在git bash命令框执行git init…

专业解读财务共享实现财务数智化转型的有效路径

近年来&#xff0c;随着数字经济的飞速发展&#xff0c;各大企业全面开启数智化转型之路&#xff0c;作为企业数智化转型的重要内容&#xff0c;财务数智化转型始于财务共享服务。然而&#xff0c;财务共享建设并不是一蹴而就的&#xff0c;如何通过财务共享实现财务数智化转型…