Python-04BeautifulSoup网络爬虫

2025-03-04-BeautifulSoup网络爬虫

记录BeautifulSoup网络爬虫的核心知识点


文章目录

  • 2025-03-04-BeautifulSoup网络爬虫
    • @[toc]
    • 1-参考网址
    • 2-学习要点
    • 3-核心知识点
      • 1. 安装
      • 2. 导入必要的库
      • 3. 发送 HTTP 请求
      • 4. 创建 BeautifulSoup 对象
      • 5. 解析 HTML 内容
        • 5.1 查找标签
        • 5.2 根据属性查找
        • 5.3 CSS 选择器
      • 6. 获取标签内容和属性
        • 6.1 获取标签文本内容
        • 6.2 获取标签属性值
      • 7. 处理嵌套标签
      • 8. 处理编码问题
      • 9. 异常处理
      • 10. 遵守网站规则
    • 4-常用方法
      • 1-属性与方法
      • 2-其他属性
      • 3-查找方法
    • 5-代码示例
      • 1-网页搜索
      • 2-网页标题
      • 3-网页编码
      • 4-查询标签a
      • 5-查询标签p
      • 6-查询父标签
      • 7-查询div
      • 8-查询CSS
      • 9-更新网页
      • 10-转化网页
      • 11-lxml进行XPath查找

1-参考网址

  • Python爬虫–BeautifulSoup:https://blog.csdn.net/weixin_45953332/article/details/145971342
  • 个人尝试代码仓库:https://gitee.com/enzoism/beautifulsoup

2-学习要点

  • 1)进行网页请求-打印网页内容
  • 2)进行网页请求-确保请求成功
  • 3)进行网页请求-自动检测编码
  • 4)进行网页请求-find和finaAll-href属性/文本内容
  • 5)进行网页请求-XPath表达式查找
  • 6)进行网页请求-CSS元素捕获
  • 7)进行网页请求-修改HTML内容-可修改标签的属性、文本或删除标签
  • 8)进行网页请求-转换为字符串

3-核心知识点

BeautifulSoup 是一个用于从 HTML 或 XML 文件中提取数据的 Python 库,结合合适的网络请求库(如requests)可以方便地实现网络爬虫。以下是使用
BeautifulSoup 进行网络爬虫的核心知识点:

1. 安装

使用pip来安装 BeautifulSoup 库,通常还需要安装解析器,常用的解析器有lxml(速度快)和html.parser(Python 内置)。

pip install beautifulsoup4
pip install lxml

2. 导入必要的库

在编写代码前,需要导入requests用于发送 HTTP 请求,BeautifulSoup用于解析 HTML 或 XML 内容。

import requests
from bs4 import BeautifulSoup

3. 发送 HTTP 请求

使用requests库发送 HTTP 请求,获取网页的 HTML 内容。

url = 'https://example.com'
response = requests.get(url)# 检查请求是否成功
if response.status_code == 200:html_content = response.text
else:print(f"请求失败,状态码: {response.status_code}")

4. 创建 BeautifulSoup 对象

使用BeautifulSoup类创建一个解析对象,需要传入 HTML 内容和解析器名称。

soup = BeautifulSoup(html_content, 'lxml')

5. 解析 HTML 内容

5.1 查找标签
  • find():返回第一个匹配的标签对象。
# 查找第一个 <title> 标签
title_tag = soup.find('title')
print(title_tag)
  • find_all():返回所有匹配的标签对象列表。
# 查找所有 <a> 标签
all_links = soup.find_all('a')
for link in all_links:print(link)
5.2 根据属性查找

可以通过attrs参数或直接指定属性名来查找具有特定属性的标签。

# 查找所有 class 为 'example-class' 的 <div> 标签
divs = soup.find_all('div', class_='example-class')
for div in divs:print(div)# 查找所有 id 为 'example-id' 的标签
element = soup.find(id='example-id')
print(element)
5.3 CSS 选择器

使用select()方法通过 CSS 选择器来查找标签。

# 查找所有 <p> 标签下的 <a> 标签
links_in_paragraphs = soup.select('p a')
for link in links_in_paragraphs:print(link)

6. 获取标签内容和属性

6.1 获取标签文本内容

使用get_text()text属性获取标签的文本内容。

# 获取 <title> 标签的文本内容
title_text = title_tag.get_text()
print(title_text)
6.2 获取标签属性值

使用字典索引的方式获取标签的属性值。

# 获取第一个 <a> 标签的 href 属性值
first_link = soup.find('a')
if first_link:href_value = first_link['href']print(href_value)

7. 处理嵌套标签

BeautifulSoup 可以方便地处理嵌套标签,通过层层查找获取所需信息。

# 查找一个包含多个 <li> 标签的 <ul> 标签
ul_tag = soup.find('ul')
if ul_tag:li_tags = ul_tag.find_all('li')for li in li_tags:print(li.get_text())

8. 处理编码问题

在处理不同编码的网页时,可能需要指定编码方式。

response = requests.get(url)
response.encoding = 'utf-8'  # 指定编码方式
html_content = response.text

9. 异常处理

在网络请求和解析过程中,可能会出现各种异常,需要进行适当的异常处理。

try:response = requests.get(url)response.raise_for_status()  # 检查请求是否成功html_content = response.textsoup = BeautifulSoup(html_content, 'lxml')# 进行后续解析操作
except requests.RequestException as e:print(f"请求出错: {e}")
except Exception as e:print(f"发生其他错误: {e}")

10. 遵守网站规则

在进行网络爬虫时,需要遵守网站的robots.txt规则,避免对网站造成过大压力。可以使用robotparser库来检查是否可以访问某个页面。

from urllib.robotparser import RobotFileParserrp = RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()
if rp.can_fetch('*', 'https://example.com'):# 可以进行爬取操作pass
else:print("不允许爬取该页面")

4-常用方法

1-属性与方法

以下是 BeautifulSoup 中常用的属性和方法:

方法/属性描述示例
BeautifulSoup()用于解析 HTML 或 XML 文档并返回一个 BeautifulSoup 对象。soup = BeautifulSoup(html_doc, 'html.parser')
.prettify()格式化并美化文档内容,生成结构化的字符串。print(soup.prettify())
.find()查找第一个匹配的标签。tag = soup.find('a')
.find_all()查找所有匹配的标签,返回一个列表。tags = soup.find_all('a')
.find_all_next()查找当前标签后所有符合条件的标签。tags = soup.find('div').find_all_next('p')
.find_all_previous()查找当前标签前所有符合条件的标签。tags = soup.find('div').find_all_previous('p')
.find_parent()返回当前标签的父标签。parent = tag.find_parent()
.find_all_parents()查找当前标签的所有父标签。parents = tag.find_all_parents()
.find_next_sibling()查找当前标签的下一个兄弟标签。next_sibling = tag.find_next_sibling()
.find_previous_sibling()查找当前标签的前一个兄弟标签。prev_sibling = tag.find_previous_sibling()
.parent获取当前标签的父标签。parent = tag.parent
.next_sibling获取当前标签的下一个兄弟标签。next_sibling = tag.next_sibling
.previous_sibling获取当前标签的前一个兄弟标签。prev_sibling = tag.previous_sibling
.get_text()提取标签内的文本内容,忽略所有 HTML 标签。text = tag.get_text()
.attrs返回标签的所有属性,以字典形式表示。href = tag.attrs['href']
.string获取标签内的字符串内容。string_content = tag.string
.name返回标签的名称。tag_name = tag.name
.contents返回标签的所有子元素,以列表形式返回。children = tag.contents
.descendants返回标签的所有后代元素,生成器形式。for child in tag.descendants: print(child)
.parent获取当前标签的父标签。parent = tag.parent
.previous_element获取当前标签的前一个元素(不包括文本)。prev_elem = tag.previous_element
.next_element获取当前标签的下一个元素(不包括文本)。next_elem = tag.next_element
.decompose()从树中删除当前标签及其内容。tag.decompose()
.unwrap()移除标签本身,只保留其子内容。tag.unwrap()
.insert()向标签内插入新标签或文本。tag.insert(0, new_tag)
.insert_before()在当前标签前插入新标签。tag.insert_before(new_tag)
.insert_after()在当前标签后插入新标签。tag.insert_after(new_tag)
.extract()删除标签并返回该标签。extracted_tag = tag.extract()
.replace_with()替换当前标签及其内容。tag.replace_with(new_tag)
.has_attr()检查标签是否有指定的属性。if tag.has_attr('href'):
.get()获取指定属性的值。href = tag.get('href')
.clear()清空标签的所有内容。tag.clear()
.encode()编码标签内容为字节流。encoded = tag.encode()
.is_empty_element检查标签是否是空元素(例如 <br><img> 等)。if tag.is_empty_element:
.is_ancestor_of()检查当前标签是否是指定标签的祖先元素。if tag.is_ancestor_of(another_tag):
.is_descendant_of()检查当前标签是否是指定标签的后代元素。if tag.is_descendant_of(another_tag):

2-其他属性

方法/属性描述示例
.style获取标签的内联样式。style = tag['style']
.id获取标签的 id 属性。id = tag['id']
.class_获取标签的 class 属性。class_name = tag['class']
.string获取标签内部的字符串内容,忽略其他标签。content = tag.string
.parent获取标签的父元素。parent = tag.parent

3-查找方法

方法/属性描述示例
find_all(string)使用字符串查找匹配的标签。tag = soup.find_all('div', class_='container')
find_all(id)查找指定 id 的标签。tag = soup.find_all(id='main')
find_all(attrs)查找具有指定属性的标签。tag = soup.find_all(attrs={"href": "http://example.com"})

5-代码示例

1-网页搜索

import requests
from bs4 import BeautifulSoup# 使用 requests 获取网页内容
url = 'https://cn.bing.com/'  # 抓取bing搜索引擎的网页内容
response = requests.get(url)# 使用 BeautifulSoup 解析网页-推荐使用 lxml 作为解析器(速度更快)
soup = BeautifulSoup(response.text, 'lxml')  # 使用 lxml 解析器
# 解析网页内容 html.parser 解析器
# soup = BeautifulSoup(response.text, ‘html.parser’)
print(soup.prettify())  # 打印网页内容

2-网页标题

import requests
from bs4 import BeautifulSoup# 使用 requests 获取网页内容
url = 'https://cn.bing.com/'  # 抓取bing搜索引擎的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 确保请求成功
if response.status_code == 200:# 使用 BeautifulSoup 解析网页-推荐使用 lxml 作为解析器(速度更快)soup = BeautifulSoup(response.text, 'lxml')  # 使用 lxml 解析器print(soup.prettify())  # 打印网页内容# 查找<title>标签title_tag = soup.find('title')# 打印标题文本if title_tag:print(title_tag.get_text())else:print("未找到<title>标签")else:print('请求失败')

3-网页编码

import chardet
import requests
from bs4 import BeautifulSoup# 使用 requests 获取网页内容
url = 'https://cn.bing.com/'  # 抓取bing搜索引擎的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 使用 chardet 自动检测编码
encoding = chardet.detect(response.content)['encoding']
print(encoding)
response.encoding = encoding
# 确保请求成功
if response.status_code == 200:# 使用 BeautifulSoup 解析网页-推荐使用 lxml 作为解析器(速度更快)soup = BeautifulSoup(response.text, 'lxml')  # 使用 lxml 解析器print(soup.prettify())  # 打印网页内容# 查找<title>标签title_tag = soup.find('title')# 打印标题文本if title_tag:print(title_tag.get_text())else:print("未找到<title>标签")else:print('请求失败')

4-查询标签a

import requests
from bs4 import BeautifulSoup# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')# 查找第一个a标签
first_link = soup.find('a')
print(first_link)
print("----------------------------")# 获取第一个 标签的 href 属性
first_link_url = first_link.get('href')
print(first_link_url)
print("----------------------------")# 获取第一个 标签的 文本 属性
first_link_text = first_link.text.strip()
print(first_link_text)
print("----------------------------")# 查找所有a标签
all_links = soup.find_all('a')
print(all_links)

5-查询标签p

import requests
from bs4 import BeautifulSoup# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')# 获取第一个 标签中的文本内容
paragraph_text = soup.find('p').get_text()# 获取页面中所有文本内容
all_text = soup.get_text()
print(all_text)

6-查询父标签

import requests
from bs4 import BeautifulSoup# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')# 查找第一个a标签
first_link = soup.find('a')
print(first_link)
print("----------------------------")# 获取第一个 标签的 href 属性
first_link_url = first_link.get('href')
print(first_link_url)
print("----------------------------")# 获取当前标签的父标签
parent_tag = first_link.parent
print(parent_tag.get_text())

7-查询div

import requests
from bs4 import BeautifulSoup# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')# 查找第一个a标签
first_link = soup.find('a')
print(first_link)
print("----------------------------")# 查找所有 class="example-class" 的 <div> 标签
divs_with_class = soup.find_all('div', class_='example-class')
print(divs_with_class)
print("----------------------------")# 查找具有 id="su" 的 <p> 标签
unique_input = soup.find('input', id='su')
print(unique_input)
# 获取 input 输入框的值
input_value = unique_input['value']
print(input_value)
print("----------------------------")

8-查询CSS

import requests
from bs4 import BeautifulSoup# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')# 查找第一个a标签
first_link = soup.find('a')
print(first_link)
print("----------------------------")# 使用CSS选择器-查找所有 class 为 'example' 的 <div> 标签
example_divs = soup.select('div.example')
print("----------------------------")# 使用CSS选择器-查找所有 <a> 标签中的 href 属性
links = soup.select('a[href]')
print(links)
print("----------------------------")# 使用CSS选择器-查找嵌套的 <div> 标签
nested_divs = soup.find_all('div', class_='nested')
for div in nested_divs:print(div.get_text())

9-更新网页

import requests
from bs4 import BeautifulSoup# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')# 查找第一个a标签
first_link = soup.find('a')
print(first_link)
print("----------------------------")# 获取第一个 标签的 href 属性
first_link_url = first_link.get('href')
print(first_link_url)
# 修改第一个 标签的 href 属性
first_link['href'] = 'http://popyu.com'
# 再次打印标签的 href 属性
first_link_url = first_link.get('href')
print(first_link_url)
print("----------------------------")

10-转化网页

import requests
from bs4 import BeautifulSoup# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')# 转换为字符串
html_str = str(soup)
print(html_str)
print("----------------------------")

11-lxml进行XPath查找

from lxml import etree# 定义 HTML 片段
html_content = '<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>'# 使用 lxml 的 HTML 解析器解析 HTML 内容
parser = etree.HTMLParser()
tree = etree.fromstring(html_content, parser)# 使用 XPath 表达式查找 <a> 标签,并提取其文本内容
a_tag = tree.xpath('//a[@class="mnav"]')
if a_tag:text = a_tag[0].textprint(text)
else:print("未找到匹配的 <a> 标签。")

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑

参考原文&#xff1a;[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑 还在为多台电脑需要多套键盘鼠标而烦恼吗&#xff1f;是不是在操控 Windows、macOS、Linux 不同系统电脑时手忙脚乱&#xff1f;现在&#xff0c;这些问题通通能解决&#xff01;Deskflow 软件闪亮登…

docker学习笔记(1)从安装docker到使用Portainer部署容器

docker学习笔记第一课 先交代背景 docker宿主机系统&#xff1a;阿里云ubuntu22.04 开发机系统&#xff1a;win11 docker镜像仓库&#xff1a;阿里云&#xff0c;此阿里云与宿主机系统没有关系&#xff0c;是阿里云提供的一个免费的docker仓库 代码托管平台&#xff1a;github&…

Ollama 框架本地部署教程:开源定制,为AI 项目打造专属解决方案!

Ollama 是一款开源的本地大语言模型&#xff08;LLM&#xff09;运行框架&#xff0c;用于管理和运行语言模型。具有以下核心特点&#xff1a; 开源可定制&#xff1a;采用 MIT 开源协议&#xff0c;开发者能自由使用、阅读源码并定制&#xff0c;可根据自身需求进行功能扩展和…

【AIGC】通义万相 2.1 与蓝耘智算:共绘 AIGC 未来绚丽蓝图

一、引言 在人工智能技术迅猛发展的今天&#xff0c;AIGC&#xff08;生成式人工智能内容生成&#xff09;领域正以惊人的速度改变着我们的生活和工作方式。从艺术创作到影视制作&#xff0c;从广告设计到智能客服&#xff0c;AIGC 技术的应用越来越广泛。通义万相 2.1 作为一…

打印三角形及Debug

打印三角形及Debug package struct; ​ public class TestDemo01 {public static void main(String[] args) {//打印三角形 五行 ​for (int i 1; i < 5; i) {for (int j 5 ; j >i; j--) {System.out.print(" ");}for (int k1;k<i;k) {System.out.print(&…

C 语 言 --- 猜 数 字 游 戏

C 语 言 --- 猜 数 字 游 戏 代 码 全 貌 与 功 能 介 绍游 戏 效 果 展 示游 戏 代 码 详 解头 文 件 引 入菜单函数游 戏 逻 辑 函 数 gamerand 函 数 详 解逻 辑 函 数 game 主 函 数 总结 &#x1f4bb;作 者 简 介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验…

免费分享一个软件SKUA-GOCAD-2022版本

若有需要&#xff0c;可以下载。 下载地址 通过网盘分享的文件&#xff1a;Paradigm SKUA-GOCAD 22 build 2022.06.20 (x64).rar 链接: https://pan.baidu.com/s/10plenNcMDftzq3V-ClWpBg 提取码: tm3b 安装教程 Paradigm SKUA-GOCAD 2022版本v2022.06.20安装和破解教程-CS…

记录一次Spring事务失效导致的生产问题

一、背景介绍 公司做的是“聚合支付”业务&#xff0c;对接了微信、和包、数字人民币等等多家支付机构&#xff0c;我们提供统一的支付、退款、自动扣款签约、解约等能力给全国的省公司、机构、商户等。 同时&#xff0c;需要做对账功能&#xff0c;即支付机构将对账文件给到…

IntelliJ IDEA集成MarsCode AI

IntelliJ IDEA集成MarsCode AI IDEA中安装插件 安装完毕之后登录自己的账号 点击链接&#xff0c;注册账号 https://www.marscode.cn/events/s/i5DRGqqo/ 可以选择不同的模型

FPGA学习篇——Verilog学习4

1.1 结构语句 结构语句主要是initial语句和always语句&#xff0c;initial 语句它在模块中只执行一次&#xff0c;而always语句则不断重复执行&#xff0c;以下是一个比较好解释的图: (图片来源于知乎博主罗成&#xff0c;画的很好很直观&#xff01;) 1.1.1 initial语句 ini…

并发编程(线程池)面试题及原理

1. 执行原理/核心参数 1.1 核心参数 核心参数 corePoolSize 核心线程数目maximumPooISize 最大线程数目 &#xff08;核心线程&#xff0b;救急线程的最大数目&#xff09;keepAliveTime 生存时间- 救急线程的生存时间&#xff0c;生存时间内没有新任务&#xff0c;此线程资…

Java 大视界 -- Java 大数据在智慧交通信号灯智能控制中的应用(116)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

1.15-16-17-18迭代器与生成器,函数,数据结构,模块

目录 15&#xff0c;Python3 迭代器与生成器15-1 迭代器15-1-1 基础知识15-1-2 迭代器与for循环工作原理 15-2 生成器&#xff08;本质就是迭代器&#xff09;15-2-1 yield 表达式15-2-2 三元表达式15-2-3 列表生成式15-2-4 其他生成器&#xff08;——没有元祖生成式——&…

如何同步this.goodAllData里面的每一项给到row

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

react中如何使用使用react-redux进行数据管理

以上就是react-redux的使用过程&#xff0c;下面我们开始优化部分&#xff1a;当一个组件只有一个render生命周期&#xff0c;那么我们可以改写成一个无状态组件&#xff08;UI组件到无状态组件&#xff0c;性能提升更好&#xff09;

基于qt的桌面宠物——纳西妲源码纯享

本专栏会不定时更新&#xff0c;如果有有趣的C代码或者编程可以在评论区留言&#xff0c;我会尽量满足粉丝的要求&#xff0c;同时还希望看到的朋友点个赞/收藏&#xff08;感谢/感谢&#xff09; 代码 main.cpp: #include "widget.h"#include <QApplication&g…

用于管理 Elasticsearch Serverless 项目的 AI Agent

作者&#xff1a;来自 Elastic Fram Souza 由自然语言驱动的 AI 代理&#xff0c;可轻松管理 Elasticsearch Serverless 项目 - 支持项目创建、删除和状态检查。 这个小型命令行工具让你可以用简单的英语管理你的无服务器 Elasticsearch 项目。它通过AI&#xff08;这里是 Ope…

C语言_图书管理系统_借阅系统管理

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 小伞的主页&#xff1a;xiaosan_blog 本文所需对顺序表的理解&#xff1a; 注&#xff1a;由于顺序表实现图书…

车辆运维管理行业洞察与竞品分析

1. 前言 车辆运维管理是指对车辆进行日常维护、故障处理、性能监测、成本控制等一系列活动的管理。随着物联网、大数据、人工智能等技术的发展&#xff0c;车辆运维管理软件和解决方案的市场竞争日益激烈。 2. 确定目标 通过产品差异化定位&#xff0c;找到竞争者的差异&…

Spring源码分析のAOP

文章目录 前言一、wrapIfNecessary1.1、getAdvicesAndAdvisorsForBean1.1.1、findCandidateAdvisors1.1.2、findAdvisorsThatCanApply 1.2、createProxy 二、invoke2.1、getInterceptorsAndDynamicInterceptionAdvice2.1.1、getInterceptors 2.2、proceed2.2.1、invoke 三、Asp…