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

利用 Jsoup 进行高效 Web 抓取与 HTML 处理

Jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 JQuery 的操作方法来取出和操作数据。

官网:https://jsoup.org/

中文文档:Jsoup 快速入门 | JAVA-TUTORIAL

1. Jsoup相关概念

1. Document

  • 定义:Document 对象表示整个 HTML 文档。
  • 用途:用于解析 HTML 字符串或从 URL 获取 HTML 内容。

2. Element

  • 定义:Element 对象表示 HTML 中的一个标签元素。
  • 用途:用于选择和操作具体的 HTML 元素。

3. Elements

  • 定义:Elements 对象是一个 Element 对象的集合。
  • 用途:用于存储多个匹配的元素。

4. Node

  • 定义:Node 是 Element 和 Text 的基类,表示 HTML 文档中的节点。
  • 用途:用于更细粒度的操作,如处理注释、文档类型声明等。

5. TextNode

  • 定义:TextNode 表示 HTML 文档中的纯文本节点。
  • 用途:用于处理元素内的文本内容。

6. CSS 选择器

  • 定义:CSS 选择器是一种用于选择 HTML 元素的语法。
  • 用途:用于精确选择文档中的特定元素。
  • 常用选择器:
    • #id:选择具有指定 ID 的元素。
    • .class:选择具有指定类的元素。
    • tag:选择指定标签的元素。
    • tag[attr]:选择具有指定属性的元素。
    • tag[attr=value]:选择具有指定属性值的元素。

7. 连接和请求

  • 定义:Jsoup 提供了连接到 URL 并获取 HTML 文档的功能。
  • 用途:用于从远程服务器获取 HTML 内容。

2.Jsoup 的优点

1.易用性:

  • 简洁的 API:Jsoup 提供了非常简洁和直观的 API,使得开发者可以快速上手。
  • 链式调用:支持链式调用,使代码更加简洁和可读。

2.强大的解析能力:

  • HTML 解析:能够解析不规范的 HTML,即使 HTML 结构不完整也能正确解析。
  • CSS 选择器:支持类似于 jQuery 的 CSS 选择器,方便提取和操作 HTML 元素。

3.网络请求:

  • HTTP 请求:内置了简单的 HTTP 客户端,可以方便地发送 GET 和 POST 请求。
  • 自动处理重定向:支持自动处理 HTTP 重定向。

4.安全性:

  • HTML 清洗:提供了 Jsoup.clean 方法,可以清理 HTML 以防止 XSS 攻击,确保输出的安全性。

3.Jsoup 的缺点

1.性能问题:

  • 内存消耗:在处理大文件或大量数据时,Jsoup 可能会消耗较多的内存,尤其是在解析复杂的 HTML 文档时。
  • 速度较慢:与一些低级别的解析库相比,Jsoup 的解析速度可能稍慢,特别是在高并发场景下。

2.功能限制:

  • 有限的 HTTP 功能:虽然内置了 HTTP 客户端,但功能相对简单,对于复杂的需求(如多线程请求、高级认证等)可能需要额外的库支持。
  • 缺乏高级特性:相比于一些更专业的爬虫框架(如 Scrapy),Jsoup 缺乏一些高级特性,如分布式爬取、自动反爬机制等。

3.依赖管理:

  • 依赖项:Jsoup 本身依赖较少,但在实际项目中可能需要引入其他库来补充其功能,增加了项目的复杂性。

4.错误处理:

  • 异常处理:Jsoup 的异常处理机制较为简单,对于一些复杂的错误情况可能需要开发者自行处理。

4. 执行流程

4.1. 添加依赖

<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.3</version>
</dependency>

4.2. 获取 Document

Jsoup 类方法列表:

方法名称

是否静态

参数

返回值

描述

parse(String html)

String html

Document

从字符串中解析 HTML 并返回一个 Document 对象。

parse(File in, String charsetName)

File in, String charsetName

Document

从文件中解析 HTML 并返回一个 Document 对象。

parse(URL url, int timeoutMillis)

URL url, int timeoutMillis

Document

从 URL 中解析 HTML 并返回一个 Document 对象。

connect(String url)

String url

Connection

创建一个新的 Connection 对象,用于发送 HTTP 请求。

Connection 类方法列表:

方法名称

是否静态

参数

返回值

描述

method(Method method)

Method method

Connection

设置请求方法(GET、POST 等)。

url(URL url)

URL url

Connection

设置请求的 URL。

requestBody(String requestBody)

String requestBody

Connection

设置请求体内容。

data(String key, String value)

String key, String value

Connection

添加表单数据。

header(String key, String value)

String key, String value

Connection

添加请求头。

userAgent(String userAgent)

String userAgent

Connection

设置 User-Agent。

referrer(String referrer)

String referrer

Connection

设置 Referer。

timeout(int millis)

int millis

Connection

设置连接超时时间(毫秒)。

followRedirects(boolean follow)

boolean follow

Connection

设置是否自动跟随重定向。

ignoreHttpErrors(boolean ignore)

boolean ignore

Connection

设置是否忽略 HTTP 错误(如 404)。

ignoreContentType(boolean ignore)

boolean ignore

Connection

设置是否忽略内容类型检查。

maxBodySize(int maxSize)

int maxSize

Connection

设置响应体的最大大小(字节)。

cookie(String key, String value)

String key, String value

Connection

添加 Cookie。

cookies(Map<String, String> cookies)

Map<String, String> cookies

Connection

添加多个 Cookie。

execute()

Connection.Response

执行请求并返回响应对象。

get()

Document

发送 GET 请求并返回解析后的 Document 对象。

post()

Document

发送 POST 请求并返回解析后的 Document 对象。

Connection.Response 类方法列表:

方法名称

是否静态

参数

返回值

描述

body()

String

获取响应体内容。

parse()

Document

解析响应体为 Document 对象。

statusCode()

int

获取响应状态码。

statusMessage()

String

获取响应状态消息。

url()

URL

获取最终请求的 URL(可能经过重定向)。

headers()

Map<String, List>

获取响应头。

header(String key)

String key

String

获取指定响应头的值。

cookies()

Map<String, String>

获取响应中的 Cookie。

cookie(String key)

String key

String

获取指定 Cookie 的值。

4.3. 获取Element 或 Elements 及 文本内容

Document 类方法列表:

方法名称

是否静态

参数

返回值

描述

title()

String

获取文档的标题。

select(String cssQuery)

String cssQuery

Elements

使用 CSS 选择器选择元素。

getElementsByTag(String tagName)

String tagName

Elements

获取指定标签名的所有元素。

getElementById(String id)

String id

Element

获取指定 ID 的元素。

html()

String

获取文档的 HTML 内容。

text()

String

获取文档的文本内容。

Elements 类方法列表:

方法名称

是否静态

参数

返回值

描述

first()

Element

获取第一个元素。

last()

Element

获取最后一个元素。

size()

int

获取元素的数量。

get(int index)

int index

Element

获取指定索引的元素。

eachText()

List

获取所有元素的文本内容列表。

eachAttr(String attributeKey)

String attributeKey

List

获取所有元素的指定属性值列表。

Element 类方法列表:

方法名称

是否静态

参数

返回值

描述

attr(String key)

String key

String

获取元素的属性值。

removeAttr(String key)

String key

Element

移除元素的属性。

addClass(String className)

String className

Element

添加 CSS 类。

removeClass(String className)

String className

Element

移除 CSS 类。

text()

String

获取元素的文本内容。

html()

String

获取元素的 HTML 内容。

append(String html)

String html

Element

在元素末尾追加 HTML。

prepend(String html)

String html

Element

在元素开头插入 HTML。

select(String cssQuery)

String cssQuery

Elements

使用 CSS 选择器选择子元素。

5.CSS 选择器

5.1.基本选择器

1.标签选择器

  • 选择所有
    标签:div
  • 选择所有 标签:a

2.类选择器

  • 选择所有带有 class=“example” 的元素:.example

3.ID 选择器

  • 选择 ID 为 example 的元素:#example

4.属性选择器

  • 选择所有带有 href 属性的 标签:a[href]
  • 选择所有 href 属性值为 http://example.com 的 标签:a[href=“http://example.com”]
  • 选择所有 href 属性值包含 example 的 标签:a[href*=“example”]
  • 选择所有 href 属性值以 http 开头的 标签:a[href^=“http”]
  • 选择所有 href 属性值以 .html 结尾的 标签:a[href$=“.html”]
  • 选择所有 src 属性值匹配正则表达式的 标签:img[src~=(i)(png|jpeg)]

5.命名空间选择器

  • 选择所有在 fb 命名空间中的 name 标签:fb|name

6.通配符选择器

  • 选择所有元素:*

5.2.组合选择器

1.后代选择器

  • 选择所有在
    内部的

    标签:div p

2.子选择器

  • 选择所有直接在
    内部的

    标签:div > p

3.相邻兄弟选择器

  • 选择所有紧接在

    后面的

    标签:h1 + p

4.通用兄弟选择器

  • 选择所有在

    后面的

    标签:h1 ~ p

5.元素+ID

  • 选择所有带有 ID 为 logo 的
    标签:div#logo

6.元素+类

  • 选择所有带有 class=“title” 的
    标签:div.title

7.元素+属性

  • 选择所有带有 href 属性的 标签:a[href]

8. 多个类选择器

  • 选择所有同时带有 class=“info” 和 class=“active” 的元素:.info.active

9.多个选择器组合

  • 选择所有带有 class=“highlight” 且带有 href 属性的 标签:a[href].highlight

5.3.伪类选择器

1.索引选择器

  • 选择索引值小于 3 的 标签:td:lt(3)
  • 选择索引值大于 2 的

    标签:div p:gt(2)

  • 选择索引值等于 1 的 标签:form input:eq(1)

2. 包含选择器

  • 选择包含

    标签的

    标签:div:has§

  • 选择不包含 class=“logo” 的所有
    标签:div:not(.logo)

3.文本匹配选择器

  • 选择包含文本 jsoup 的

    标签:p:contains(jsoup)

  • 选择直接包含文本 jsoup 的

    标签:p:containsOwn(jsoup)

4.正则表达式匹配选择器

  • 选择文本匹配正则表达式的
    标签:div:matches((i)login)
  • 选择自身包含文本匹配正则表达式的
    标签:div:matchesOwn((i)login)

6. 实战示例

以爬取https://ssr3.scrape.center/这个网站为例:

1. 获取所有电影信息。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpHeaders;import java.io.IOException;@SpringBootTest
public class JsoupTests {@Testpublic void testJsoup() throws IOException {String url = "https://ssr3.scrape.center/";Document document = Jsoup.connect(url).header(HttpHeaders.AUTHORIZATION, "Basic YWRtaW46YWRtaW4=").get();// 解析电影信息Elements movieItems = document.select(".el-card__body");for (Element item : movieItems) {// 提取电影名称和链接Element nameLink = item.select("a.name").first();if (nameLink != null) {String movieName = nameLink.select("h2").text();String movieUrl = nameLink.attr("href");// 提取电影封面URLElement coverImage = item.select("img.cover").first();String coverImageUrl = coverImage != null ? coverImage.attr("src") : "N/A";// 提取电影类别String category = item.select(".el-button.category").text();// 提取国家和片长Elements infoElements = item.select(".info");String countryAndDuration = infoElements.get(0).text();String[] parts = countryAndDuration.split(" / ");String country = parts[0];String duration = parts[1];// 提取上映日期String releaseDate = infoElements.get(1).text();// 提取评分String score = item.select(".score").text();// 提取星级评分String starRating = item.select(".el-rate").attr("aria-valuenow");// 打印提取的信息System.out.println("电影名称: " + movieName);System.out.println("电影链接: " + movieUrl);System.out.println("电影封面URL: " + coverImageUrl);System.out.println("电影类别: " + category);System.out.println("国家: " + country);System.out.println("片长: " + duration);System.out.println("上映日期: " + releaseDate);System.out.println("评分: " + score);System.out.println("星级评分: " + starRating);System.out.println("----------------------------");}}}
}

测试结果为:

2. 打印所有电影的电影类别、国家和片长、上映日期、评分、星级评分、总条数及页面链接

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpHeaders;import java.io.IOException;@SpringBootTest
public class JsoupTests {public static void main(String[] args) {String url = "https://ssr3.scrape.center/";try {// 连接并获取文档Document document = Jsoup.connect(url).header("Authorization", "Basic YWRtaW46YWRtaW4=").get();// 提取电影类别Elements categoryButtons = document.select(".el-button.category");for (Element button : categoryButtons) {System.out.println("电影类别: " + button.text());}// 提取国家和片长Elements infoDivs = document.select(".info");for (Element div : infoDivs) {System.out.println("国家和片长: " + div.text());}// 提取上映日期Elements releaseDateDivs = document.select(".info:contains(上映)");for (Element div : releaseDateDivs) {System.out.println("上映日期: " + div.text());}// 提取评分Elements scoreElements = document.select(".score");for (Element score : scoreElements) {System.out.println("评分: " + score.text());}// 提取星级评分Elements rateElements = document.select(".el-rate");for (Element rate : rateElements) {int fullStars = rate.select(".el-rate__icon.el-icon-star-on").size();int halfStar = rate.select(".el-rate__decimal.el-icon-star-on").size();double rating = fullStars + (halfStar > 0 ? 0.5 : 0);System.out.println("星级评分: " + rating);}// 提取分页信息Element pagination = document.select(".el-pagination").first();if (pagination != null) {String totalItems = pagination.select(".el-pagination__total").text();System.out.println("总条数: " + totalItems);Elements pageLinks = pagination.select(".el-pager li.number a");for (Element link : pageLinks) {System.out.println("页面链接: " + link.attr("href"));}}} catch (IOException e) {e.printStackTrace();}}
}

打印结果:

相关文章:

利用 Jsoup 进行高效 Web 抓取与 HTML 处理

Jsoup 是一款 Java 的 HTML 解析器&#xff0c;可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API&#xff0c;可通过 DOM&#xff0c;CSS 以及类似于 JQuery 的操作方法来取出和操作数据。 官网&#xff1a;https://jsoup.org/ 中文文档&#xff1a;Jsou…...

线上问题——频繁 Full GC 问题的排查思路

文章目录 一、查看 GC 日志二、分析内存泄漏三、检查对象生命周期四、优化代码五、调整垃圾回收策略六、使用监控工具 一、查看 GC 日志 启用 GC 日志 在 Java 应用中&#xff0c;需要在启动参数中添加适当的参数来启用 GC 日志记录。可以使用-XX:PrintGCDetails、-XX:PrintGCD…...

ParrotOS,一个与kali类似的渗透测试操作系统

介绍 Parrot Security&#xff08;ParrotOS&#xff0c;Parrot&#xff09;是一个基于 Debian Stable 的免费开源 GNU/Linux 发行版&#xff0c;专为安全专家、开发人员和注重隐私的人设计。 它包括一个完整的便携式武器库&#xff0c;用于 IT 安全和数字取证操作。它还包括开…...

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&am…...

《Java核心技术I》Swing选择组件中的复选框

选择组件 除了输入&#xff0c;也需要选择组件&#xff0c;接下来介绍&#xff0c;复选框、单选按钮、选项列表以及滑块。 复选框 需要紧邻标签来说明其用途。 bold new JCheckBox("Bold"); 调用setSelected方法来选中或取消复选框 bold.setSelected(true); isSelec…...

ES6学习Generator 函数(生成器)(八)

这里写目录标题 一、基本概念二、代码三、Generator 函数的异步应用三级目录 一、基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案&#xff0c;语法行为与传统函数完全不同&#xff0c;Generator 函数有多种理解角度。语法上&#xff0c;首先可以把它理解成&#x…...

练习题 最小栈

最小栈 最小栈 class MinStack {private Stack<Integer> stack;private Stack<Integer> minstack;public MinStack() {stacknew Stack<>();minstacknew Stack<>();}public void push(int val) {stack.push(val);if(minstack.empty()){minstack.push(…...

windows环境下pytorch安装踩坑

目录 1 前言2 安装Anaconda3 安装CUDA4 创建Python3.9环境5 安装Pytorch环境5.1 conda方式5.2 pip方式 6 验证是否安装成功7 注意事项7.1 no module named torch问题7.12 torch.cuda.is_available()返回False问题 8 最佳实践9 总结 1 前言 这两天由于要使用Genesis&#xff0c;…...

从图纸泄密到全面安全防护 —— 域智盾软件在设计公司的应用

从图纸泄密到全面安全防护 —— 域智盾软件在设计公司的应用 作为一家设计公司的老板&#xff0c;我深知设计图纸对公司来说有多么重要。每一份设计图纸不仅凝聚着我们团队的智慧和辛勤劳动&#xff0c;也代表着公司的技术创新和核心竞争力。 然而&#xff0c;前段时间的一次…...

【ELK】Filebeat采集Docker容器日志

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 介绍filebeat是如何工作的 使用部署filebeat 介绍 Filebeat 是一个用于转发和集中日志数据的轻量级传送器。 Filebeat 作为agent安装在服务器上&#xff0c;监视指…...

基于java web在线商城购物系统源码+论文

一、环境信息 开发语言&#xff1a;JAVA JDK版本&#xff1a;JDK8及以上 数据库&#xff1a;MySql5.6及以上 Maven版本&#xff1a;任意版本 操作系统&#xff1a;Windows、macOS 开发工具&#xff1a;Idea、Eclipse、MyEclipse 开发框架&#xff1a;SpringbootHTMLjQueryMysq…...

MONI后台管理系统-swagger3(springdoc-openapi)集成

springdoc-openapi Java 库有助于使用 Spring Boot 项目自动生成 API 文档。springdoc-openapi 通过在运行时检查应用程序来根据 Spring 配置、类结构和各种注释推断 API 语义。 该库会自动生成 JSON/YAML 和 HTML 格式的页面文档。生成的文档可以使用swagger-api注释进行补充。…...

常见八股文04

63.索引的优缺点 优点 1.提高了查询性能 2.支持唯一性约束&#xff0c;避免插入重复数据 3.支持唯一性约束&#xff1a;在多表连接时&#xff0c;索引能够减少连接所需的时间和资源 缺点 1.占用额外存储空间:特别是在大型数据表中&#xff0c;索引可能会占用大量的空间 …...

php各个版本的特性以及绕过方式

一.php各个版本的特性 二.绕过正则匹配的常见方式 1.绕过空格 a.空变量$ l$s b.环境变量IFS&#xff08;默认情况下IFS为空格、制表符和换行符&#xff09; l${IFS}s c.重定向符&#xff08;<,>&#xff09; cat < file.txt //把file.txt的内容给cat命令&…...

允许某段网络访问Linux服务器上的MariaDB

在Linux服务器上安装了MariaDB&#xff0c;默认情况下&#xff0c;只允许本机访问。在某些特殊的情况下&#xff0c;要允许外部访问。具体操作流程如下&#xff1a; 1 修改服务器配置 vi /etc/my.cnf.d/server.cnf取消下面的注释&#xff0c;以便允许外来的主机访问。 bind-…...

【C语言】信号

【C语言】信号 信号1. 信号状态2. 信号处理方式3. 信号注册相关函数4. 信号集相关函数 信号 1. 信号状态 信号有三种状态&#xff1a;产生、未决和递达 信号产生方式&#xff1a; 按键产生&#xff0c;ctrlc 产生 中断信号SIGINT&#xff0c;ctrl \ 产生退出信号 SIGQUIT并…...

2023年下半年软考信息安全工程师案例分析及答案解析

试题一(16分) 回答问题1至问题6,将解答填入答题纸对应的解答栏内。 问题1(4分) 已知DES算法S盒如下,请补全S盒空缺的数据(1)、(2)、(3)、(4)。 【参考答案】3、13、15、0 问题2(2分) 已知S盒的输入为110011,请计算经过S盒变换之后的二进制输出。 【参考…...

攻防世界easyphp

<?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),-6,6)){$key1 1;}else{die("Emmm...再想想&quo…...

【WRF教程第3.6期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解&#xff1a;以4.5版本为例 Geogrid/Metgrid 插值选项详解1. 插值方法的工作机制2. 插值方法的详细说明2.1 四点双线性插值&#xff08;four_pt&#xff09;2.2 十六点重叠抛物线插值&#xff08;sixteen_pt&#xff09;2.3 简单四点平均插值&#xff08;av…...

图解HTTP-HTTP协议

HTTP HTTP是一种不保存状态&#xff0c;即无状态的协议。HTTP协议自身不对请求和响应之间的通信进行保存。为了保存状态因此后面也有一些技术产生比如Cookies技术。 HTTP是通过URI定位网上的资源&#xff0c;理论上将URI可以访问互联网上的任意资源。 如果不是访问特定的资源…...

Linux基本命令

Linux基本命令 一条Linux命令由&#xff1a;命令本身 [可选项] [参数] ls 展示 ls命令的选项: -a 选项&#xff0c;可以展示出隐藏的内容 以 . 开头的文件或文件夹默认被隐藏&#xff0c;需要-a才能显示出来 **-l **选项,以列表的形式展示内容,并展示更多细节-h 选项&…...

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)

一、RAGFlow简介 RAGFlow是一个基于对文档深入理解的开源RAG&#xff08;Retrieval-augmented Generation&#xff0c;检索增强生成&#xff09;引擎。 主要作用&#xff1a; 让用户创建自有知识库&#xff0c;根据设定的参数对知识库中的文件进行切块处理&#xff0c;用户向大…...

.ejs 后缀文件 - 嵌入式JavaScript模板

嵌入式JavaScript模板&#xff08;Embedded JavaScript templates&#xff09;文件是以.ejs 后缀。它是一种模板引擎&#xff0c;它允许你在你的HTML文件中直接嵌入JavaScript代码。EJS模板可以包含HTML代码、JavaScript表达式、控制结构&#xff08;如if语句和循环&#xff09…...

springboot461学生成绩分析和弱项辅助系统设计(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装学生成绩分析和弱项辅助系统软件来发挥其高效地信息处理的作…...

【从零开始入门unity游戏开发之——C#篇23】C#面向对象继承——`as`类型转化和`is`类型检查、向上转型和向下转型、里氏替换原则(LSP)

文章目录 一、as类型转化和is类型检查1、as 关键字使用场景&#xff1a;语法&#xff1a;示例&#xff1a;特点&#xff1a; 2、is 关键字使用场景&#xff1a;语法&#xff1a;示例&#xff1a;特点&#xff1a; 3、总结 二、向上转型和向下转型1、向上转型示例&#xff1a; 2…...

“魔法糖果盒的秘密:用朴素贝叶斯算法猜糖果颜色”

想象一下&#xff0c;你有一个神奇的糖果盒&#xff0c;这个糖果盒里有两种糖果&#xff1a;红色的和蓝色的。你闭上眼睛&#xff0c;从盒子里拿出一个糖果&#xff0c;然后尝一尝&#xff0c;你想知道这个糖果是红色的还是蓝色的。朴素贝叶斯算法就像是一个魔法规则&#xff0…...

使用“NodeMCU”、“红外模块”实现空调控制

项目思路 空调遥控器之所以能够实现对空调的控制&#xff0c;是因为它能够向空调发射出特定的红外信号。从理论上来说&#xff0c;任何能够发射出这种相同红外信号的红外发射器&#xff0c;都可以充当空调遥控器&#xff08;这也正是手机能够控制多种不同品牌空调的原因所在&a…...

了解cuda的统一内存

1. CUDA 6中的统一内存 在CUDA 6中&#xff0c;从Kepler GPU架构&#xff08;计算能力3.0或更高&#xff09;开始&#xff0c;在64位Windows 7、8和Linux操作系统&#xff08;内核2.6.18&#xff09;上开始支持统一内存. 从CUDA 6开始&#xff0c;NVIDIA推出了CUDA平台历史上…...

MySQL索引

2.1 索引概述 2.1.1 介绍 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足 特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c; 这样就…...

会话控制(cookie、session 和 token)

1. 介绍 所谓会话控制就是 对会话进行控制HTTP 是一种无状态的协议&#xff0c;它没有办法区分多次的请求是否来自于同一个客户端&#xff0c; 无法区分用户&#xff0c;而产品中又大量存在的这样的需求&#xff0c;所以我们需要通过 会话控制 来解决该问题。 常见的会话控制…...

stm32 rtc 详解

目录 L151 RTC 唤醒代码 方式一 通过 RTC Alarm Interrupt&#xff1a;(基本和F1系列一样)&#xff1a; L151 RTC 唤醒代码 方式二 通过 RTC WakeUp Interrupt F103VE RTC 闹钟唤醒代码 &#xff08;103RC 没有闹钟中断&#xff09;&#xff1a; RTC&#xff08;real time…...

D 咖智能饮品机器人:开启商业新篇

在科技迅猛发展的当下&#xff0c;智能机器人正逐步渗透到各个商业领域&#xff0c;D 咖智能饮品机器人便是其中的佼佼者&#xff0c;它的出现为饮品行业带来全新的发展契机&#xff0c;有望开启商业新篇。 从大环境来看&#xff0c;消费者对于饮品的需求日益多元化和个性化。他…...

使用FakeSMTP创建本地SMTP服务器接收邮件具体实现。

以下代码来自Let’s Go further节选。具体说明均为作者本人理解。 编辑邮件模版 主要包含三个template: subject&#xff1a;主题plainBody&#xff1a; 纯文本正文htmlBody&#xff1a;超文本语言正文 {{define "subject"}}Welcome to Greenlight!{{end}} {{def…...

重拾设计模式--模板方法模式

文章目录 一、模板方法模式概述二、模板方法模式UML图三、优点1代码复用性高2可维护性好3扩展性强 四、缺点五、使用场景六、C 代码示例1七、 C 代码示例2 一、模板方法模式概述 定义&#xff1a;定义一个操作中的算法骨架&#xff0c;而降一些步骤延迟到子类中。模板方法使得…...

二、windows环境下vscode使用wsl教程

本篇文件介绍了在windows系统使用vscode如何连接使用wsl&#xff0c;方便wsl在vscode进行开发。 1、插件安装 双击桌面vscode&#xff0c;按快捷键CtrlShiftX打开插件市场&#xff0c;搜索【WSL】点击安装即可。 2、开启WSL的linux子系统 点击左下方图标【Open a Remote Win…...

我们的电视Our tv 3.6.0安卓+TV 一款全新电视直播软件-内置稳定直播源

应用简介 我们的电视&#xff08;ourtv&#xff09;是一款完全无广告的电视直播软件&#xff0c;清晰度可选择高清&#xff0c;超清&#xff0c;蓝光等播放。安装即可使用&#xff0c;再也不用费劲去找各种不稳定的直播源了。 “我们的电视”播放线路&#xff08;直播源&…...

批处理理解

初识批处理 如何批处理&#xff1a; 命名&#xff1a;.bat 方法&#xff1a;创建一个记事本文件&#xff0c;然后将其扩展改为.bat 批处理作用&#xff1a;自上而下成批处理每一条DOS命令&#xff0c;直到执行到最后一条。运行环境&#xff1a;当然是我们cmd了 回归我学过的…...

高效准确的PDF解析工具,赋能企业非结构化数据治理

目录 准确性高&#xff1a;还原复杂版面元素 使用便捷&#xff1a;灵活适配场景 贴心服务&#xff1a;快速响应机制 在数据为王的时代浪潮中&#xff0c;企业数据治理已成为组织优化运营、提高竞争力的关键。随着数字化进程的加速&#xff0c;企业所积累的数据量呈爆炸式增长…...

Go框架比较:goframe、beego、iris和gin

由于工作需要&#xff0c;这些年来也接触了不少的开发框架&#xff0c;Golang的开发框架比较多&#xff0c;不过基本都是Web"框架"为主。这里稍微打了个引号&#xff0c;因为大部分"框架"从设计和功能定位上来讲&#xff0c;充其量都只能算是一个组件&…...

【ETCD】【实操篇(三)】【ETCDCTL】如何向集群中写入数据

在分布式系统中&#xff0c;etcd 是一个高可用的键值存储&#xff0c;用于存储和共享配置信息、服务发现、协调等。向 etcd 写入数据可以通过多种方式进行&#xff0c;常见的方式是使用 etcd 提供的 HTTP API 或者通过客户端库来进行操作。 目录 一、使用EtcdCtl工具来写入数据…...

2025年春节档的《哪吒2》,光线传媒动画梦的关键一战

没想到《哪吒之魔童闹海》会以这种形式重回大众视野。 距离2025年春节还有不到两个月&#xff0c;春节档电影大战已经打响&#xff0c;原本市场还在猜测2024年频频“胎动”的《哪吒之魔童闹海》&#xff08;以下简称《哪吒2》&#xff09;会不会参与这场“神仙打架”&#xff…...

windows C#-实例构造函数

声明一个实例构造函数&#xff0c;以指定在使用 new 表达式创建某个类型的新实例时所执行的代码。 要初始化静态类或非静态类中的静态变量&#xff0c;可以定义静态构造函数。 如以下示例所示&#xff0c;可以在一种类型中声明多个实例构造函数&#xff1a; class Coords {pu…...

FPGA-PS端编程1:

目标 在小梅哥的zynq 7015上&#xff0c;完成以下目标&#xff1a; 读取 S1 按键的电平&#xff0c; 当 S1 按键为按下状态时&#xff0c;驱动 PS LED 以 1S 的频率闪烁(注意理解 1S 的频率闪烁和 1S的时间翻转两种描述之间的差别)&#xff0c; 当 S1 释放后&#xff0c;停止…...

【JavaEE进阶】第一个Spring Boot程序

目录 &#x1f334;安装插件 &#x1f384;Spring Boot介绍 &#x1f333;Spring Boot项目创建 &#x1f6a9;创建Spring Boot项目 &#x1f3c0;jar 包下载不下来问题 &#x1f6a9;启动项目 &#x1f332;目录介绍 &#x1f6a9;src文件 &#x1f6a9;target文件 &…...

RunCam WiFiLink连接手机图传测试

RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线&#xff08;易忘&#xff09; 2.打开摄像头前面的盖子&#xff08;易忘&#xff09; 3.接上直流电源&#xff0c;红线为正&#xff0c;黑线为负 4.直流电源设置电压为14v&#xff0c;电流为3.15A&#xff0c; 通…...

使用Chat-LangChain模块创建一个与用户交流的机器人

当然&#xff01;要使用Chat-LangChain模块创建一个与用户交流的机器人&#xff0c;你需要安装并配置一些Python库。以下是一个基本的步骤指南和示例代码&#xff0c;帮助你快速上手。 安装依赖库 首先&#xff0c;你需要安装langchain库&#xff0c;它是一个高级框架&#x…...

地级市2011-2020数字经济 博士研究生自用数据

赵涛评价指标数据&#xff0c;具体指标见图片 参考文献: [1]赵涛,张智,梁上坤.数字经济、创业活跃度与高质量发展——来自中国城市的经验证据[J].管理世界,2020,36(10):65-76. 每百人移动电话数&#xff0c;是模仿赵涛的&#xff0c;指人均再➗100 数据来源&#xff0c;中国城…...

呼叫中心部门如何使用开源大模型智能呼叫中心,对接已有系统实现降本增效

呼叫中心部门如何使用开源大模型智能呼叫中心&#xff0c;对接已有系统实现降本增效 作者&#xff1a;开源大模型智能呼叫中心FreeIPCC 随着人工智能技术的快速发展&#xff0c;特别是大规模语言模型&#xff08;LLM&#xff09;的应用&#xff0c;企业可以通过将开源大模型与…...

Latex 转换为 Word(使用GrindEQ )(英文转中文,毕业论文)

效果预览 第一步&#xff1a; 告诉chatgpt&#xff1a; 将latex格式中的英文翻译为中文&#xff08;符号和公式不要动&#xff09;,给出latex格式第二步&#xff1a; Latex 转换为 Word&#xff08;使用GrindEQ &#xff09; 视频 https://www.bilibili.com/video/BV1f242…...

多态中虚函数调用问题

在多态中&#xff0c;一般通过虚函数表会调用子类重写的虚函数&#xff0c;然而&#xff0c;有一种情况调用的还是父类的虚函数&#xff0c;就是在父类的构造函数中调用的是父类的虚函数&#xff0c;无论子类是否重写。 #include <iostream> #include <list> #inc…...