当前位置: 首页 > news >正文

【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发者,都能从中汲取知识,助力掌握爬虫核心技能,开拓技术视野。

目录

  • 一、引言
  • 二、正则表达式高级语法详解
    • 2.1 分组(Grouping)
    • 2.2 回溯引用(Backreferences)
    • 2.3 零宽断言(Zero - width Assertions)
  • 三、re 库的复杂文本模式匹配与数据提取实战
    • 3.1 re 库基础回顾
    • 3.2 复杂文本模式匹配案例
    • 3.3 数据提取技巧与注意事项
  • 四、正则表达式在爬虫中的性能优化策略
    • 4.1 性能问题分析
    • 4.2 优化方法介绍
      • 4.2.1 合理使用非贪婪模式
      • 4.2.2 减少不必要的分组
      • 4.2.3 编译正则表达式
    • 4.3 性能优化前后对比测试
  • 五、总结与展望


一、引言

在爬虫开发的广袤领域中,正则表达式犹如一把锋利且万能的瑞士军刀,发挥着举足轻重的作用。当我们运用爬虫程序从网页的海量信息里提取数据时,正则表达式能凭借其强大的模式匹配能力,精准定位并抽取出我们所需的数据片段。无论是网页的标题、链接、文本内容,还是图片、音频的地址等,正则表达式都能高效完成提取任务。

它不仅是数据提取的得力工具,在数据处理阶段同样表现出色。比如,在爬取到的数据中可能存在一些杂乱无章的格式、多余的符号或者不规范的字符,正则表达式可以轻松地对这些数据进行清洗和整理,使其符合我们后续分析和使用的要求。在验证数据格式的准确性,如判断邮箱地址、电话号码、身份证号码等是否合规时,正则表达式也能大显身手。

本文将深入探讨正则表达式的高级语法,包括分组、回溯引用、零宽断言等,详细介绍如何使用 Python 的 re 库进行复杂文本模式的匹配与数据提取,并着重研究如何处理正则表达式在爬虫应用中的性能优化问题,助力读者将正则表达式的运用提升到新的高度。

二、正则表达式高级语法详解

2.1 分组(Grouping)

分组是正则表达式中非常实用的一个功能,它允许我们将一部分正则表达式组合成一个逻辑单元,以便对这部分内容进行整体操作,比如提取、重复匹配等。在正则表达式中,使用圆括号 () 来创建分组。例如,对于一个简单的匹配邮箱地址的正则表达式 (\w+)@(\w+).(\w+),这里面就包含了三个分组:第一个分组 (\w+) 用于匹配邮箱地址中的用户名部分;第二个分组 (\w+) 匹配域名的主体部分;第三个分组 (\w+) 匹配域名的后缀部分。

在爬虫的实际应用中,分组能帮助我们更精准地提取网页中的数据。假设我们要从一个网页中提取所有 <a> 标签内的链接和文本内容,HTML 代码片段如下:

<html><body><a href="https://www.example.com">示例网站</a><a href="https://www.baidu.com">百度</a></body>
</html>

我们可以使用如下正则表达式及 Python 代码来实现:

import rehtml = """
<html><body><a href="https://www.example.com">示例网站</a><a href="https://www.baidu.com">百度</a></body>
</html>
"""pattern = re.compile(r'<a href="(.*?)">(.*?)</a>')
matches = pattern.findall(html)
for match in matches:link, text = matchprint(f"链接: {link}, 文本: {text}")

在这个例子中,(.*?) 就是两个分组,第一个分组用于捕获 <a> 标签的 href 属性值,第二个分组用于捕获 <a> 标签内的文本内容。通过 findall 方法返回的结果是一个列表,列表中的每个元素都是一个元组,元组的第一个元素是链接,第二个元素是文本内容。这样,我们就能够清晰地将所需的数据从网页中提取出来。

2.2 回溯引用(Backreferences)

回溯引用是指在正则表达式中引用之前定义的分组所匹配到的内容。它通过使用反斜杠 \ 加上分组的编号来实现,编号从 1 开始。例如,(\w+)\1 这个正则表达式中,\1 就是对第一个分组 (\w+) 的回溯引用,它表示匹配与第一个分组所匹配内容相同的字符串。这在处理一些具有重复结构的数据时非常有用。

在爬虫场景中,比如我们要处理一个包含 HTML 标签的文本,确保标签的开始和结束是匹配的。HTML 代码片段如下:

<div>这是一个div标签内的内容</div>
<span>这是一个span标签内的内容</span>
<div>这个div标签没有正确闭合

我们可以使用回溯引用的正则表达式来匹配正确闭合的标签:

import rehtml = """
<div>这是一个div标签内的内容</div>
<span>这是一个span标签内的内容</span>
<div>这个div标签没有正确闭合
"""pattern = re.compile(r'<(\w+)>.*?</\1>')
matches = pattern.findall(html)
for match in matches:print(f"匹配到正确闭合的标签: <{match}>...</{match}>")

在这个例子中,(\w+) 是第一个分组,用于匹配开始标签的名称,</\1> 中的 \1 引用了第一个分组所匹配的标签名称,这样就确保了结束标签与开始标签是一致的。通过这种方式,我们可以筛选出 HTML 中正确闭合的标签,避免处理错误格式的标签数据,提高数据提取的准确性。

2.3 零宽断言(Zero - width Assertions)

零宽断言是一种特殊的正则表达式语法,它用于指定一个位置,这个位置满足一定的条件,但并不匹配实际的字符,也就是所谓的 “零宽度”。零宽断言分为正向零宽断言和负向零宽断言,每种又分为先行断言和后发断言,总共四种类型:

  • 正向零宽先行断言:x(?=y),表示 x 后面跟随 y 时匹配 x,但不包含 y。例如,\d+(?=元) 可以匹配所有以 “元” 为单位的数字,如 “100 元” 中的 “100”。
  • 正向零宽后发断言:(?<=y)x,表示 x 前面是 y 时匹配 x,但不包含 y。例如,(?<=第)\d+(?=页) 可以匹配 “第 10 页” 中的 “10”。
  • 负向零宽先行断言:x(?!y),表示 x 后面不跟随 y 时匹配 x。例如,\d+(?!00) 可以匹配所有不以 “00” 结尾的数字。
  • 负向零宽后发断言:(?<!y)x,表示 x 前面不是 y 时匹配 x。例如,(?<!老)王 可以匹配不是 “老王” 的 “王”,如 “小王” 中的 “王”。

在爬虫中,零宽断言常用于在复杂的文本中精准定位特定的数据。假设我们有一个网页,其中包含一些商品信息,格式如下:

<p>商品名称:苹果,价格:5</p>
<p>商品名称:香蕉,价格:3</p>

如果我们只想提取价格部分,且确保价格后面跟着 “元” 字,可以使用正向零宽先行断言:

import rehtml = """
<p>商品名称:苹果,价格:5元</p>
<p>商品名称:香蕉,价格:3元</p>
"""pattern = re.compile(r'\d+(?=元)')
matches = pattern.findall(html)
for match in matches:print(f"提取到的价格: {match}")

在这个例子中,\d+(?=元) 表示匹配一个或多个数字,并且这个数字后面必须紧跟着 “元” 字,但 “元” 字并不包含在匹配结果中。这样,我们就能够准确地从网页中提取出价格数据,而不会受到其他无关信息的干扰。

三、re 库的复杂文本模式匹配与数据提取实战

3.1 re 库基础回顾

在 Python 中,re 库是处理正则表达式的核心工具,它提供了一系列强大的函数来实现文本的匹配、搜索、替换等操作。在进行复杂文本模式匹配与数据提取之前,我们先来简要回顾一下 re 库的常用函数:

  • re.match(pattern, string, flags=0):从字符串的起始位置开始尝试匹配正则表达式pattern,如果匹配成功,则返回一个Match对象;如果匹配失败,返回None。其中,string是待匹配的字符串,flags是一些可选的标志位,用于控制正则表达式的匹配方式,比如re.I表示忽略大小写匹配,re.M表示多行匹配模式等。例如:
import re
match = re.match(r'hello', 'hello world')
if match:print(match.group())  # 输出: hello
  • re.search(pattern, string, flags=0):在整个字符串中搜索第一个匹配正则表达式pattern的位置,如果找到匹配项,则返回一个Match对象;否则返回None。与re.match不同的是,re.search并不要求从字符串的起始位置开始匹配。示例如下:
import re
search_result = re.search(r'world', 'hello world')
if search_result:print(search_result.group())  # 输出: world
  • re.findall(pattern, string, flags=0):搜索整个字符串,以列表的形式返回所有匹配正则表达式pattern的子串。如果没有找到匹配的子串,则返回一个空列表。例如:
import re
findall_result = re.findall(r'\d+', 'abc123def456')
print(findall_result)  # 输出: ['123', '456']

这些基础函数是我们使用 re 库进行文本处理的基石,在复杂的爬虫场景中,它们与正则表达式的高级语法相结合,能够实现更加精准和高效的数据提取。

3.2 复杂文本模式匹配案例

接下来,我们通过一个实际的案例来展示如何使用 re 库结合正则表达式高级语法进行复杂文本模式的匹配与数据提取。假设我们要爬取一个新闻网站的网页内容,并从中提取新闻标题、发布时间和正文信息。以某新闻网站的 HTML 代码片段为例:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>示例新闻</title>
</head>
<body><div class="news-item"><h1 class="news-title">人工智能在医疗领域的新突破</h1><div class="news-meta"><span class="news-time">2024-10-01 10:00:00</span></div><div class="news-content"><p>近日,一项关于人工智能在医疗影像诊断方面的研究取得了重大突破。研究团队通过大量的数据训练,使得人工智能模型能够更准确地识别疾病特征,提高了诊断的准确率...</p></div></div>
</body>
</html>

我们可以使用如下 Python 代码和正则表达式来提取所需信息:

import rehtml = """
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>示例新闻</title>
</head>
<body><div class="news-item"><h1 class="news-title">人工智能在医疗领域的新突破</h1><div class="news-meta"><span class="news-time">2024-10-01 10:00:00</span></div><div class="news-content"><p>近日,一项关于人工智能在医疗影像诊断方面的研究取得了重大突破。研究团队通过大量的数据训练,使得人工智能模型能够更准确地识别疾病特征,提高了诊断的准确率...</p></div></div>
</body>
</html>
"""# 提取新闻标题
title_pattern = re.compile(r'<h1 class="news-title">(.*?)</h1>')
title_match = title_pattern.search(html)
if title_match:title = title_match.group(1)print(f"新闻标题: {title}")# 提取发布时间
time_pattern = re.compile(r'<span class="news-time">(.*?)</span>')
time_match = time_pattern.search(html)
if time_match:time = time_match.group(1)print(f"发布时间: {time}")# 提取正文
content_pattern = re.compile(r'<div class="news-content">.*?<p>(.*?)</p>', re.S)
content_match = content_pattern.search(html)
if content_match:content = content_match.group(1)print(f"正文: {content}")

在上述代码中,我们使用了re.compile函数将正则表达式编译成Pattern对象,这样可以提高匹配效率,尤其是在多次使用相同正则表达式的情况下。对于新闻标题的提取,我们使用了<h1 class=“news-title”>(.*?)</h1>这个正则表达式,其中(.*?)是一个非贪婪分组,用于捕获<h1 class=“news-title”>和</h1>标签之间的内容。发布时间的提取类似,使用<span class=“news-time”>(.*?)来捕获时间信息。而在提取正文时,由于正文内容可能包含换行符等特殊字符,我们使用了re.S标志位,它使得.可以匹配包括换行符在内的任意字符,正则表达式<div class=“news-content”>.*?<p>(.*?)</p>能够准确地提取出<div class=“news-content”>标签内<p>标签之间的正文内容。

3.3 数据提取技巧与注意事项

在使用 re 库进行爬虫数据提取时,有一些实用的技巧和需要注意的事项:

  • 处理特殊字符:在正则表达式中,一些字符具有特殊含义,如*、+、?、|、(、)、[、]、{、}等。如果要匹配这些字符本身,需要使用反斜杠\进行转义。例如,要匹配字符串中的(abc),正则表达式应为\(abc\)。
  • 转义字符:除了特殊字符的转义,对于一些特殊的字符序列,如换行符\n、制表符\t等,在正则表达式中也需要正确表示。在 Python 的 re 库中,使用原生字符串(即在字符串前加上r前缀)可以避免额外的转义操作,使正则表达式更清晰易读。例如,r’\n’表示换行符,而’\n’在普通字符串中需要写成’\\n’。
  • 非贪婪匹配与贪婪匹配:正则表达式默认采用贪婪匹配模式,即尽可能多地匹配字符。但在很多情况下,我们需要非贪婪匹配,也就是尽可能少地匹配字符。通过在量词(如*、+、?、{n,m}等)后面加上?可以实现非贪婪匹配。例如,对于字符串aaaa,a+会匹配整个aaaa(贪婪匹配),而a+?会依次匹配出每个a(非贪婪匹配)。
  • 匹配边界:合理利用正则表达式的边界匹配符,如^(匹配字符串开头)、$(匹配字符串结尾)、\b(匹配单词边界)等,可以更精准地定位要匹配的内容。例如,\bhello\b可以确保只匹配独立的单词 “hello”,而不会匹配 “helloworld” 中的 “hello”。
  • 错误处理:在实际爬虫过程中,网页结构可能会发生变化,或者数据格式不符合预期,这就需要进行适当的错误处理。例如,在使用re.search或re.findall等函数提取数据后,要检查返回结果是否为None或空列表,以避免程序因数据缺失而报错。可以使用如下代码进行简单的错误处理:
match = re.search(pattern, html)
if match:data = match.group(1)
else:data = ""  # 或进行其他默认值设置或错误提示

通过掌握这些技巧和注意事项,我们能够在爬虫中更灵活、准确地使用 re 库进行数据提取,提高爬虫程序的稳定性和可靠性。

四、正则表达式在爬虫中的性能优化策略

4.1 性能问题分析

在爬虫应用中,正则表达式虽然功能强大,但如果使用不当,很容易引发性能问题。其中,匹配时间过长是一个常见的问题。当我们使用复杂的正则表达式去匹配大规模的网页文本时,正则引擎需要对文本中的每个字符进行逐一检查和匹配,这会消耗大量的时间。例如,在一个包含大量新闻文章的网页中,如果使用一个包含多个嵌套量词和复杂分组的正则表达式来提取文章内容,可能会导致匹配过程变得异常缓慢,甚至在处理大型网页时出现程序卡顿或无响应的情况。

资源消耗过大也是不容忽视的性能问题。正则表达式的匹配过程涉及到大量的内存操作,包括字符的读取、模式的解析以及匹配结果的存储等。如果在爬虫中频繁使用正则表达式,且每次匹配的文本量较大,就会导致内存占用不断增加,可能会引发内存溢出等错误,影响爬虫程序的稳定性和运行效率。此外,复杂的正则表达式在编译和执行过程中也会占用较多的 CPU 资源,降低系统的整体性能。

4.2 优化方法介绍

4.2.1 合理使用非贪婪模式

在正则表达式中,贪婪模式是默认的匹配方式,它会尽可能多地匹配字符,直到整个表达式能够匹配为止。例如,对于正则表达式a.*b,在匹配字符串axxxbxxxab时,它会匹配从第一个a到最后一个b的整个部分axxxbxxxab。而在爬虫提取数据时,这种贪婪匹配可能会导致提取到的数据不准确或包含多余的内容。

非贪婪模式则通过在量词后面加上一个问号?来启用,如*?、+?或??。在非贪婪模式下,正则表达式会尽可能少地匹配字符,只要这样的匹配能够使整个表达式得到满足。以提取 HTML 标签内的文本为例,假设我们有以下 HTML 代码:

<div>内容1</div><div>内容2</div>

如果使用贪婪模式的正则表达式<div>.*</div>,它会匹配整个<div>内容1</div><div>内容2</div>,而我们通常希望分别提取每个<div>标签内的内容。此时,使用非贪婪模式的正则表达式<div>.*?</div>,就可以正确地匹配到<div>内容1</div>和<div>内容2</div>这两个部分,从而准确地提取出 “内容 1” 和 “内容 2”。通过合理使用非贪婪模式,能够减少不必要的字符匹配,提高匹配效率,尤其是在处理包含重复结构的文本时,效果更为显著。

4.2.2 减少不必要的分组

分组在正则表达式中用于将一部分正则表达式组合成一个逻辑单元,以便进行提取、重复匹配等操作。然而,过多的分组会对性能产生负面影响。因为每个分组都需要额外的内存来存储匹配结果,并且在匹配过程中,正则引擎需要对每个分组进行单独的处理和记录,这会增加计算量和时间开销。

在爬虫场景中,我们应尽量精简分组。例如,在匹配一个简单的日期格式 “YYYY-MM-DD” 时,如果使用(\d{4})-(\d{2})-(\d{2})这样包含三个分组的正则表达式,虽然可以分别提取出年、月、日,但如果我们只是需要验证日期格式的正确性,并不需要提取具体的年、月、日部分,那么可以使用\d{4}-\d{2}-\d{2}这样不包含分组的正则表达式,这样可以减少不必要的内存占用和计算开销,提高正则表达式的执行效率。

4.2.3 编译正则表达式

在 Python 中,使用re.compile函数可以将正则表达式编译成Pattern对象。编译后的正则表达式在多次使用时,能够提高执行效率。这是因为编译过程会将正则表达式转换为一种更高效的内部表示形式,当后续进行匹配操作时,无需再次解析和编译正则表达式,直接使用已经编译好的Pattern对象进行匹配即可。

在爬虫中,如果我们需要频繁使用相同的正则表达式来提取数据,例如在一个循环中不断匹配网页中的链接,使用编译后的正则表达式可以显著提升性能。示例代码如下:

import re# 编译正则表达式
pattern = re.compile(r'href="(.*?)"')html_list = ["<a href='https://www.example.com'>示例1</a>", "<a href='https://www.baidu.com'>示例2</a>", "<a href='https://www.google.com'>示例3</a>"]
for html in html_list:matches = pattern.findall(html)for match in matches:print(f"提取到的链接: {match}")

在这个例子中,re.compile(r’href=“(.*?)”‘)将正则表达式编译成Pattern对象pattern,然后在循环中多次使用pattern.findall方法进行匹配。相比每次都直接使用re.findall(r’href=“(.*?)”’, html),编译后的方式能够避免重复的编译过程,节省时间,提高爬虫的运行效率。

4.3 性能优化前后对比测试

为了直观地展示性能优化的效果,我们通过一个具体的爬虫案例来进行对比测试。假设我们要爬取一个包含大量商品信息的网页,并使用正则表达式提取商品的价格信息。

优化前,我们使用贪婪模式的正则表达式且未进行编译,代码如下:

import re
import timestart_time = time.time()
html = "<div class='product'>价格:100元</div><div class='product'>价格:200元</div><div class='product'>价格:300元</div>" * 10000
pattern = r'价格:(\d+)元'
matches = re.findall(pattern, html)
for match in matches:print(f"提取到的价格: {match}")
end_time = time.time()
print(f"优化前运行时间: {end_time - start_time} 秒")

优化后,我们使用非贪婪模式的正则表达式并进行编译,代码如下:

import re
import timestart_time = time.time()
html = "<div class='product'>价格:100元</div><div class='product'>价格:200元</div><div class='product'>价格:300元</div>" * 10000
pattern = re.compile(r'价格:(\d+?)元')
matches = pattern.findall(html)
for match in matches:print(f"提取到的价格: {match}")
end_time = time.time()
print(f"优化后运行时间: {end_time - start_time} 秒")

通过实际运行这两段代码,我们可以得到优化前后的运行时间。在这个简单的测试案例中,优化后的代码运行时间明显缩短,这表明通过合理使用非贪婪模式和编译正则表达式,能够有效地提高正则表达式在爬虫中的性能,减少数据提取的时间,提升爬虫程序的整体效率。同时,在实际应用中,还可以结合其他性能优化策略,如减少不必要的网络请求、优化数据存储方式等,进一步提升爬虫的性能和稳定性。

五、总结与展望

正则表达式作为爬虫开发中的关键技术,其高级应用涵盖了丰富的语法和实用的技巧。通过深入理解分组、回溯引用和零宽断言等高级语法,我们能够更精准地定位和提取复杂文本中的数据,满足多样化的数据提取需求。在使用 Python 的 re 库进行复杂文本模式匹配与数据提取时,掌握 re 库的常用函数以及数据提取的技巧和注意事项,能够确保我们高效、准确地从网页中获取所需数据。同时,针对正则表达式在爬虫中可能出现的性能问题,采取合理使用非贪婪模式、减少不必要的分组以及编译正则表达式等优化策略,可以显著提升爬虫程序的运行效率和稳定性。

随着互联网技术的不断发展,网页结构和数据格式日益复杂多样,对爬虫技术的要求也越来越高。未来,正则表达式在爬虫领域将面临更多的挑战和机遇。在更复杂的爬虫场景中,如处理动态网页、对抗更高级的反爬虫机制等,正则表达式有望与其他技术(如 JavaScript 逆向、人工智能辅助解析等)相结合,发挥更大的作用。我们也需要不断探索和研究新的正则表达式应用方法和优化策略,以适应不断变化的爬虫环境,为数据采集和分析提供更强大的支持。

相关文章:

【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

推荐一款AI大模型托管平台-OpenWebUI

推荐一款AI大模型托管平台-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官网地址&#xff1a;https://openwebui.com/ GitHub地址&#xff1a; https://github.com/open-webui/open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离…...

复习dddddddd

1. 思路&#xff1a;用队列先进先出的特性 #include <iostream> #include <vector> #include <stack> #include <cstdio> #include <algorithm> #include <cstring> #include <climits> #include <cstdlib> #include <cma…...

【3.5JavaScript】JavaScript字符串对象

文章目录 1.获取字符串长度2.大小写转换3.获取某一个字符4.截取字符串5.替换字符串6.分割字符串7.检索字符串位置8.例题&#xff1a;统计某一个字符的个数 在 JavaScript 中&#xff0c;对象是非常重要的知识点。对象分为两种&#xff1a;一种是 ”自定义对象“&#xff0c;另…...

消息队列-持续更新中

消息队列 0、消息队列官方参考文档 MQ官方参考文档 RocketMQ 官方文档&#xff1a; https://rocketmq.apache.org/docs/quick-start/ RocketMQ 中国开发者中心&#xff1a;http://rocketmq.cloud/zh-cn/ Kafka 官方文档&#xff1a; http://kafka.apache.org/documentation/ …...

创建一个简单的spring boot+vue前后端分离项目

一、环境准备 此次实验需要的环境&#xff1a; jdk、maven、nvm和node.js 开发工具&#xff1a;idea或者Spring Tool Suite 4&#xff0c;前端可使用HBuilder X&#xff0c;数据库Mysql 下面提供maven安装与配置步骤和nvm安装与配置步骤&#xff1a; 1、maven安装与配置 1…...

已知点矩阵的三个顶点坐标、行列数和行列的间距,计算得出剩余所有点的坐标

已知点矩阵的三个顶点坐标、行列数和行列的间距&#xff0c;计算得出剩余所有点的坐标 计算矩阵中每个点的坐标代码实现案例图调用验证 计算矩阵中每个点的坐标 给定左上角、左下角和右上角三个点的坐标&#xff0c;以及矩阵的行数、列数、行间距和列间距&#xff0c;我们可以…...

视频mp4垂直拼接 水平拼接

视频mp4垂直拼接 水平拼接 pinjie_v.py import imageio import numpy as np import os import cv2def pinjie_v(dir1,dir2,out_dir):os.makedirs(out_dir, exist_okTrue)# 获取目录下的所有视频文件video_files_1 [f for f in os.listdir(dir1) if f.endswith(.mp4)]video_fi…...

【记录54】渐变色 linear-gradient / radial-gradient

linear-gradient 线性渐变&#xff1a;是以直线条渐变 radial-gradient 径向渐变&#xff1a;是以图型形状渐变 <!-- 线性渐变&#xff08;从一个方向到另一个方向 --><div style" background: linear-gradient(to right, red, blue);"></div><…...

一周学会Flask3 Python Web开发-response响应格式

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在HTTP响应中&#xff0c;数据可以通过多种格式传输。大多数情况下&#xff0c;我们会使用HTML格式&#xff0c;这也是Flask中…...

二级公共基础之数据结构与算法篇(八)排序技术

目录 前言 一、交换类排序 1.冒泡排序法 1. 冒泡排序的思想 2. 冒泡排序的实现步骤 3. 示例 4. 冒泡排序的特点 2.快速排序 1. 快速排序的核心思想 2. 快速排序的实现步骤 3. 示例代码(C语言) 4. 快速排序的特点 二、插入类排序 1. 简单插入排序 1.简单插入排…...

以ChatGPT为例解析大模型背后的技术

目录 1、大模型分类 2、为什么自然语言处理可计算&#xff1f; 2.1、One-hot分类编码&#xff08;传统词表示方法&#xff09; 2.2、词向量 3、Transformer架构 3.1、何为注意力机制&#xff1f; 3.2、注意力机制在 Transformer 模型中有何意义&#xff1f; 3.3、位置编…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cpuinfo 函数

ngx_cpuinfo 声明在 src/core/ngx_core.h void ngx_cpuinfo(void); 定义在 src/core/ngx_cpuinfo.c 这里 ngx_cpuinfo 的定义可以找到 2 个 使用 gcc -E 处理一下来确认当下环境中使用的是哪一个 gcc -E src/core/ngx_cpuinfo.c \-I src/core \-I src/event \-I src/event/modu…...

python小项目编程-中级(1、图像处理)

目录 图像处理 实现 测试 unittest pytest 图像处理 实现界面化操作&#xff0c;使用PIL库实现简单的图像处理功能&#xff0c;如缩放&#xff08;设置缩放比例&#xff09;、旋转和滤镜、对比度调整、亮度调整、灰度图、二值化图&#xff08;二值图如果使用的是彩色图片需…...

EasyExcel实现excel导入(模版上传)

目录 效果pom.xmlapplication.ymlcontrollerservice依赖类前台vue代码某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前…...

AI工作流+专业知识库+系统API的全流程任务自动化

我有点悲观&#xff0c;甚至很沮丧&#xff0c;因为AI留给普通人的机会不多了&#xff0c;这既是人类之间权力的斗争&#xff0c;也是硅基生命和碳基生命的斗争。AI自动化是无法避免的趋势&#xff0c;如果人类不能平权&#xff0c;那就只能跪下接受审判。 通过整合AI工作流、专…...

【C/C++】合并两个有序链表 (leetcode T21)

核心考点预览&#xff1a;链表 &#xff08;双指针&#xff09; 技巧&#xff1a;虚拟头结点 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入输出示例1l1 [1,2,4], l2 [1…...

C语言进阶习题【2】(4结构体进阶)——通讯录的实现3

1. 本节在动态版本通讯录的基础上实现存储功能 在动态版本的基础上&#xff0c;对于通讯录的新增了存储到文件中&#xff0c;可以从文件中打开我们存储的通信录功能。新增函数&#xff1a;saveContatc()和loadContact&#xff08;&#xff09; 2. 具体实现 2.1 contact.h /…...

Linux系统编程之无名管道

概述 在Linux系统中&#xff0c;无名管道是一种简单的进程间通信机制。它允许一个进程创建一对文件描述符&#xff0c;其中一个用于读取&#xff0c;另一个用于写入。当一个进程通过系统调用创建了一个无名管道后&#xff0c;便可以将这两个文件描述符传递给它的子进程&#xf…...

deepseek与其他大模型配合组合

DeepSeek与其他大模型的配合组合&#xff0c;展现了其在多个领域中的强大应用潜力和灵活性。以下是对DeepSeek与其他大模型配合组合的详细分析&#xff1a; 一、DeepSeek与华知大模型的组合 背景介绍&#xff1a; 华知大模型是同方知网与华为联手打造的&#xff0c;具备全学科…...

ASP.NET Core Clean Architecture

文章目录 项目地址一、1. 重点1.1 Repository数据库接口1.2 GetEventDetail 完整的Query流程1.3 创建Command并使用validation 项目地址 教程作者&#xff1a;ASP.NET Core Clean Architecture 2022-12 教程地址&#xff1a; https://www.bilibili.com/video/BV1YZ421M7UA?…...

DeepSeek安装部署笔记(一)

Ollamaopen-WebUI部署 DeepSeek安装部署笔记第一步 Ollama安装1.安装ollama&#xff1a;官网https://ollama.com/下载2.上面安装完成&#xff0c;在cmd命令行&#xff1a; 第二步 给DeepSeek添加OpenWebUI界面&#xff08;重点&#xff09;1.安装conda&#xff1a;用它来管理py…...

ProfiNet转EtherNet/IP罗克韦尔PLC与监控系统通讯案例

一、案例背景 在新能源产业蓬勃发展的当下&#xff0c;大型光伏电站作为绿色能源的重要输出地&#xff0c;其稳定高效的运行至关重要。某大型光伏电站占地面积广阔&#xff0c;内部设备众多&#xff0c;要保障电站的稳定运行&#xff0c;对站内各类设备进行集中监控与管理必不可…...

23.2 HtmlDocument类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 HtmlDocument类提供了HTML文档的顶级编程访问&#xff0c;配合WebBrowser的 Document属性使用&#xff0c;可以获得WebBrowser当前页…...

wordpress adrotate插件 文件上传漏洞

当你爆破进wordpress后台但权限不是管理员的时&#xff0c;如果你有adrotate插件操作权限可以用adrotate的文件上传功能get webshell 该漏洞需要AdRotate版本 < 5.13.3 第一步按顺序点击上传文件 在这里文件一定要压缩成zip格式&#xff0c;上传的时候也是上传这个zip 上…...

数据分析和数据挖掘的工作内容

基本的数据分析工作通常包含以下几个方面的内容&#xff1a; 确定目标&#xff08;输入&#xff09;&#xff1a;理解业务&#xff0c;确定指标口径。获取数据&#xff1a;数据仓库&#xff08;SQL提数&#xff09;、电子表格、三方接口、网络爬虫、开放数据集等。清洗数据&am…...

【Pandas】pandas Series sample

Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐&#xff0c;使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…...

qt + opengl 给立方体增加阴影

在前几篇文章里面学会了通过opengl实现一个立方体&#xff0c;那么这篇我们来学习光照。 风氏光照模型的主要结构由3个分量组成&#xff1a;环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子&#xff1a; 1 环境光照(Ambient …...

buuctf-[极客大挑战 2019]Knife题解

一个很简单的web题&#xff0c;进入界面 网页名还加白给的shell&#xff0c;并且给的提示也很明显&#xff0c;给了一个一句话木马再加上菜刀&#xff0c;很怀疑是一个webshell题&#xff0c;那么直接打开蚁剑测试连接拿shell 用提示的一句话木马的密码&#xff0c;测试链接发现…...

常用电脑,护眼软件推荐 f.lux 3400K | 撰写论文 paper

常用电脑&#xff1f;平均每天用 5 个小时&#xff1f;你就要考虑用一个护眼软件了&#xff0c;对皮肤也好。因为电脑屏幕有辐射&#xff0c;比如蓝光。 f.lux 作为一款专业护眼软件&#xff0c;值得使用。之前用了三年的 Iris Pro&#xff0c;现在 f.lux 做的更好了。 使用…...

【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致

业务场景 发布信息&#xff0c;更新到数据库MySQLCOS操作&#xff0c;更新JSON文件 不过可能存在幂等性和数据一致性的问题。 // 批量存MySQL entityPublishService.saveOrUpdateBatch(entityPublishList); // 遍历批量存COS对象存储searchEntitys.forEach(req -> {//删除…...

[答疑]领域建模:邓丽君、周杰伦和少女时代

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第五元素 2025-2-18 17:12 潘老师&#xff0c;画线的这句话&#xff0c;在这个类图中怎么体现呢&#xff1f; &#xff08;回答者补注&#xff1a;问题的素材来自《邓丽君的领域建模》…...

【鸿蒙开发】第四十三章 Notification Kit(用户通知服务)

目录​​​​​​​ 1 简介 1.1 使用场景 1.2 能力范围 1.3 业务流程 1.4 通知样式 1.5 约束限制 1.6 与相关Kit的关系 2 请求通知授权 2.1 接口说明 2.2 开发步骤 3 管理通知角标 3.1 接口说明 3.2 开发步骤 4 管理通知渠道 4.1 通知渠道类型说明 4.2 接口说明…...

Ubuntu 20.04源码安装opencv 4.5.0

安装依赖项 sudo apt install -y g sudo apt install -y cmake sudo apt install -y make sudo apt install -y wget unzip安装opencv依赖库 sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev l…...

buu-get_started_3dsctf_2016-好久不见39

栈溢出外平栈 1外平栈与内平栈的区别 外平栈&#xff1a; 栈帧的局部变量和返回地址之间没有额外的对齐或填充。返回地址直接位于局部变量的上方&#xff08;即栈顶方向&#xff09;。在计算偏移时&#xff0c;不需要额外加 4&#xff08;因为返回地址紧邻局部变量&#xff09…...

一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili HTTP是无状态&#xff08;stateless)协议。也就是说&#xff0c;在一次请求响应结束后&#xff0c;服务器不会留下任何关于对…...

深入解析Qt事件循环

在Qt开发中&#xff0c;QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作&#xff1f;为何耗时操作会导致界面冻结&#xff1f;本文将以事件循环为核心&#xff0c;揭示Qt高效运转的底层逻辑&#xff0c;探讨其设计哲学与最…...

python中的异常-模块-包

文章目录 异常异常的定义异常捕获语法捕获常规异常捕获指定异常捕获多个异常捕获所有异常异常else异常finally 异常传递总结 模块概念导入自定义模块及导入main方法all变量 总结 包自定义包定义pycharm中建包的基本步骤导入方式 第三方包 异常 异常的定义 当检测到一个错误时…...

AI 百炼成神:线性回归,预测房价

我们开始第一个项目——线性回归:预测房价。这是一个经典的机器学习入门项目,可以帮助你理解如何使用线性回归模型来预测连续的数值。 第一个项目:线性回归预测房价 项目目标 学习线性回归的基本概念。使用历史房价数据建立一个预测模型。理解如何评估模型的性能。项目步骤…...

Grok-3 与 DeepSeek 的技术架构与性能分析

随着 AI 大模型技术的快速发展,Grok-3(xAI)与 DeepSeek-V3/R1(深度求索)成为近期备受关注的焦点。本文将从技术架构、性能表现、成本效率和应用场景等维度,深入对比分析这两大模型的优劣势。 一、技术架构对比 1. DeepSeek-V3/R1:高效 MoE 架构与工程优化 混合专家模型…...

机器学习实战(4):逻辑回归——分类问题的基础

第4集&#xff1a;逻辑回归——分类问题的基础 在机器学习中&#xff0c;逻辑回归&#xff08;Logistic Regression&#xff09; 是解决分类问题的经典算法之一。尽管名字中有“回归”&#xff0c;但它实际上是一种分类模型&#xff0c;广泛应用于二分类任务&#xff08;如垃圾…...

我是如何从 0 到 1 找到 Web3 工作的?

作者&#xff1a;Lotus的人生实验 关于我花了一个月的时间&#xff0c;从 0 到 1 学习 Web3 相关的知识和编程知识。然后找到了一个 Web3 创业公司实习的远程工作。 &#x1f447;&#x1f447;&#x1f447; 我的背景: 计算机科班&#xff0c;学历还可以(大厂门槛水平) 毕业工…...

基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案

随着物联网和嵌入式技术的快速发展&#xff0c;嵌入式设备对实时音视频通信的需求日益增长。然而&#xff0c;传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题&#xff0c;难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点&#xff0c;本文将介…...

【DeepSeek】本地部署,保姆级教程

deepseek网站链接传送门&#xff1a;DeepSeek 在这里主要介绍DeepSeek的两种部署方法&#xff0c;一种是调用API&#xff0c;一种是本地部署。 一、API调用 1.进入网址Cherry Studio - 全能的AI助手选择立即下载 2.安装时位置建议放在其他盘&#xff0c;不要放c盘 3.进入软件后…...

Java 大视界 -- 国际竞争与合作:Java 大数据在全球市场的机遇与挑战(94)

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

流程绩效分析,实现销售目标的保障

在当今竞争激烈的商业环境里&#xff0c;客户关系管理&#xff08;CRM&#xff09;行业正迎来深刻变革。企业若想在市场中脱颖而出&#xff0c;实现业务的持续增长&#xff0c;流程绩效分析成为关键。通过提供销售全流程绩效分析能力&#xff0c;企业能够针对销售全流程的复杂业…...

Linux NFS

Linux NFS NFS&#xff08;Network File System&#xff09;是一种用于在网络上共享文件系统的协议&#xff0c;允许不同的计算机通过网络访问和共享文件&#xff0c;就像访问本地文件一样。它广泛应用于 Linux 和 UNIX 系统中&#xff0c;支持多用户并发访问&#xff0c;适合…...

一文精通JWT Token、ID Token、Access Token、Refresh Token

JWT Token JSON Web Token (JWT,RFC 7519 (opens new window)),是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519)。该 token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT 的声明一般被用来在身份提供者和服务提供者…...

CSS基础(浮动、相对定位、绝对定位、固定定位、粘性定位、版心、重置默认样式)

文章目录 1. 浮动&#xff08;float&#xff09;1.1 简介1.2 元素浮动后的特点1.3 脱离文档流示例图1.4 浮动产生的影响1.4.1 积极影响1.4.2 消极影响 1.5 解决浮动产生的影响1.5.1 清除浮动&#xff08;Clearfix&#xff09;1.5.2 创建新的块格式化上下文&#xff08;BFC&…...

uniapp中引入Vant Weapp的保姆级教学(包含错误处理)

废话不多说&#xff0c;直接上方法&#xff0c;网上的教学好多都是错误的 1.安装vant weapp 在Hbuilder的终端&#xff0c;输入以下代码 npm install vant/weapp -S --production 2.新建wxcomponents文件夹 在项目的跟目录新建一个“wxcomponents’文件夹&#xff0c;与app.…...