探索 Java 网络爬虫:Jsoup、HtmlUnit 与 WebMagic 的比较分析

news2024/10/7 18:22:14

1、引言

在当今信息爆炸的时代,网络数据的获取和处理变得至关重要。对于 Java 开发者而言,掌握高效的网页抓取技术是提升数据处理能力的关键。本文将深入探讨三款广受欢迎的 Java 网页抓取工具:Jsoup、HtmlUnit 和 WebMagic,分析它们的功能特点、优势以及适用场景,以助开发者选择最适合自己项目需求的工具。

2、Jsoup

2.1、简介

Jsoup 是一款 Java 编写的开源 HTML 解析器,它提供了一套丰富的 API,用于解析、操作和清理 HTML 文档。Jsoup 能够从网页中提取数据,并且广泛应用于网络爬虫、数据挖掘和自动化测试等领域。

Jsoup 官方网站

2.2、特性

  • 轻量级:Jsoup 作为一个轻量级的库,不需要额外的服务器或复杂的配置即可使用。
  • 解析能力:能够从 HTML 文件、字符串或 URL 中解析文档,并提取数据。
  • 强大的选择器:支持 CSS 选择器和正则表达式,使得数据提取更加灵活和高效。
  • 易于使用:API 设计直观,易于上手,适合初学者和有经验的开发者。
  • 处理异常:能够处理 HTML 文档中的异常情况,如不完整的标签等。

2.3、优点

  • 易学易用:Jsoup 的 API 设计简单直观,学习成本低。
  • 灵活性:支持多种数据提取方式,适应不同的数据抽取需求。
  • 社区支持:作为一个成熟的开源项目,Jsoup 拥有活跃的社区,方便获取帮助和资源。

2.4、缺点

  • 不支持 JavaScript:无法直接处理 JavaScript 动态加载的内容。
  • 性能限制:对于大型或复杂的 HTML 文档,解析速度可能不如其他专业的解析工具。
  • 安全风险:如果不正确使用,可能会引入跨站脚本攻击(XSS)等安全问题。

2.5、使用场景

  • 静态网页爬取:适用于从不需要执行 JavaScript 的静态网页中提取信息。
  • 数据提取:从网页中提取链接、图片、文本等数据。
  • 自动化测试:在 Web 应用程序的自动化测试中,用于模拟用户操作和验证页面内容。
  • 内容清洗:清理 HTML 文档,移除不需要的元素或属性,确保输出的 HTML 是安全和干净的。

2.6、注意事项

  • JavaScript 渲染:Jsoup 不执行 JavaScript,因此无法直接从依赖 JavaScript 动态生成的内容中提取数据。
  • 编码问题:在处理非标准编码的 HTML 文档时,可能需要手动设置字符编码。
  • 异常处理:虽然 Jsoup 能够处理一些异常情况,但对于某些复杂的 HTML 结构,可能需要额外的处理逻辑。

2.7、示例代码

如果你使用的是 Maven,可以在 pom.xml 文件中添加以下依赖

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.17.2</version> <!-- 请使用最新版本 -->
</dependency>

以下是一个简单的 Jsoup 示例代码,演示了如何抓取百度首页上的热门搜索新闻:

public class JsoupExample {
    public static void main(String[] args) {
        // 目标网页 URL
        String url = "https://www.baidu.com";

        try {
            // 连接到网页并获取文档对象
            Document doc = Jsoup.connect(url).get();

            // 获取百度首页热搜
            Elements hotSearchList = doc.selectXpath("//*[@id=\"hotsearch-content-wrapper\"]/li");

            System.out.println("今日百度热搜:");
            // 遍历所有热搜新闻
            for (Element hotSearch : hotSearchList) {
                Elements newsMetaList = hotSearch.selectXpath(".//span");
                for (Element newsMeta : newsMetaList) {
                    System.out.print(newsMeta.text() + " ");
                }
                System.out.print("\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果截图如下:

在这里插入图片描述
Jsoup 主要用于静态网页的内容抓取,对于使用 Vue.js 等现代 JavaScript 框架构建的动态网站,其直接获取页面内容的能力受限。由于 Vue.js 等框架通过 JavaScript 动态生成页面内容,Jsoup 无法执行相应的脚本,因此可能无法获取到完整的、动态渲染的数据。

因此,使用 Jsoup 爬取这类网站时,通常只能获取到初始的、不包含动态数据的HTML结构。结果如下:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <div id="app"></div>
    </body>
</html>

3、HtmlUnit

3.1、简介

HtmlUnit 是一个用 Java 编写的无界面浏览器,它模拟 HTML 文档并提供了一系列 API,允许开发者以编程方式与网页进行交互。这个工具可以用于自动化测试、网络爬虫以及自动化网页交互等场景。HtmlUnit 支持 JavaScript(通过 Mozilla Rhino 引擎),并且能够处理 AJAX 功能,使得它能够与现代的动态网页进行交互。

HtmlUnit 官方网站

HtmlUnit GitHub

3.2、特性

  • 无界面:HtmlUnit 不需要图形用户界面,可以在服务器或后台环境中运行。
  • 支持 JavaScript:内置 Rhino JavaScript 引擎,可以执行 JavaScript 代码,处理 AJAX 请求。
  • 模拟浏览器行为:可以模拟用户在浏览器中的操作,如点击、表单提交等。
  • 多浏览器模拟:可以模拟多种浏览器,如 Chrome、Firefox、Internet Explorer 等。
  • 丰富的 API:提供了丰富的 API 来操作网页元素,如获取、设置属性、执行事件等。

3.3、优点

  • 易用性:HtmlUnit 的 API 设计简单直观,易于上手和使用。
  • 跨平台:作为无界面浏览器,HtmlUnit 可以在任何支持Java的平台上运行。
  • 社区支持:作为一个成熟的开源项目,HtmlUnit 拥有活跃的社区,可以方便地获取帮助和资源。

3.4、缺点

  • 性能:由于 HtmlUnit 需要解释 JavaScript,对于复杂的 JavaScript 操作,性能可能不如真实浏览器。
  • 兼容性:虽然支持多种浏览器特性,但仍有可能遇到一些网页在 HtmlUnit 中无法正确渲染或表现的问题。
  • 更新维护:随着 Web 技术的发展,HtmlUnit 需要不断更新以支持新的Web标准和特性,这可能导致版本间的不兼容问题。

3.5、使用场景

  • 自动化测试:用于 Web 应用程序的功能测试,模拟用户操作验证应用程序的行为。
  • 网络爬虫:抓取网站数据,提取信息,适用于数据分析、数据挖掘等。
  • Web 自动化:自动化执行 Web 相关的任务,如登录、下载文件、填写并提交表单等。

3.6、注意事项

  • CSS 和 JavaScript 支持:HtmlUnit 对 CSS 和 JavaScript 的支持可能不如真实浏览器完美,有时候需要禁用 CSS 和 JavaScript 来避免潜在的问题。
  • 异常处理:在处理 JavaScript 错误时,可以通过设置来防止测试因脚本错误而失败。
  • 版本兼容性:使用 HtmlUnit 时,需要注意库的版本与依赖的其他库的兼容性,以及与目标网站的 JavaScript 和 CSS 的兼容性。

3.7、示例代码

如果你使用的是 Maven,可以在 pom.xml 文件中添加以下依赖

<!-- https://mvnrepository.com/artifact/org.htmlunit/htmlunit -->
<dependency>
    <groupId>org.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>4.0.0</version> <!-- 请使用最新版本 -->
</dependency>

以下是一个简单的 HtmlUnit 示例代码,演示了如何抓取百度首页上的热门搜索新闻:

public class HtmlUnitExample {
    public static void main(String[] args) {
        // 目标网页 URL
        String url = "https://www.baidu.com";

        WebClient webClient = getWebClient();

        try {
            // 打开网页
            HtmlPage page = webClient.getPage(url);

            // 获取网页标题
            String title = page.getTitleText();
            System.out.println("网页标题: " + title);

            // 获取百度首页热搜
            List<DomElement> hotSearchList = page.getByXPath("//*[@id=\"hotsearch-content-wrapper\"]/li");
            System.out.println("今日百度热搜:");
            // 遍历所有热搜新闻
            for (DomElement hotSearch : hotSearchList){
                List<DomElement> newsMetaList = hotSearch.getByXPath(".//span");
                for (DomElement newsMeta : newsMetaList) {
                    System.out.print(newsMeta.asNormalizedText() + " ");
                }
                System.out.print("\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭WebClient,释放资源
            webClient.close();
        }
    }

    /**
     * <h2>获取一个 Web 模拟浏览器客户端</h2>
     */
    public static WebClient getWebClient(){
        // 浏览器设置
        WebClient webClient = new WebClient(BrowserVersion.CHROME);

        // ajax
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
        // 支持js
        webClient.getOptions().setJavaScriptEnabled(true);
        // 忽略js错误
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        // 忽略css错误
        webClient.setCssErrorHandler(new SilentCssErrorHandler());
        // 不执行CSS渲染
        webClient.getOptions().setCssEnabled(false);
        // 超时时间
        webClient.getOptions().setTimeout(3000);
        // 允许重定向
        webClient.getOptions().setRedirectEnabled(true);
        // 允许cookie
        webClient.getCookieManager().setCookiesEnabled(true);

        return webClient;
    }
}

运行结果截图如下:

在这里插入图片描述

4、WebMagic

4.1、简介

WebMagic 是一个简单灵活的 Java 爬虫框架。基于 WebMagic,你可以快速开发出一个高效、易维护的爬虫。

WebMagic 官方网站

WebMagic 总体架构图如下:

在这里插入图片描述

4.2、特性

  • 简洁的 API:WebMagic 提供了简单直观的 API,使得开发者可以快速编写爬虫程序。
  • 强大的抽取能力:支持多种数据抽取方式,包括 XPath、正则表达式等,方便从网页中提取所需数据。
  • 多线程处理:WebMagic 内部采用多线程进行页面抓取,提高了爬取效率。
  • 自动重试机制:在请求失败时,WebMagic 能够自动重试,增强了爬虫的稳定性。
  • 灵活的数据处理:允许开发者自定义数据处理逻辑,可以将数据存储到数据库、文件或进行其他处理。
  • Site 对象:封装了目标网站的一些基本信息,如编码、重试次数、抓取间隔等,方便配置和调整。

4.3、优点

  • 易学易用:WebMagic 的 API 设计简单,学习成本低,适合初学者快速上手。
  • 高效稳定:内置多线程处理和自动重试机制,提高了爬虫的效率和稳定性。
  • 灵活性:支持自定义数据处理,可以轻松应对不同的数据存储和处理需求。

4.4、缺点

  • 社区支持:相比于其他流行的爬虫框架,WebMagic 的社区可能相对较小,资源和支持可能有限。
  • 更新维护:Web 技术不断发展,WebMagic 需要不断更新以适应新的网页结构和反爬策略,可能存在一定的维护成本。
  • JavaScript 渲染:WebMagic 在处理 JavaScript 动态渲染的页面时可能存在局限,对于复杂的 JavaScript 操作可能需要额外的处理。

4.5、使用场景

  • 数据抓取:适用于抓取网站信息,如新闻、博客、商品数据等。
  • 网站监控:可以用来监控目标网站的更新,及时获取最新内容。
  • 数据分析:抓取的数据可以直接用于数据分析、市场研究等领域。

4.6、注意事项

  • 遵守 robots.txt:在使用 WebMagic 进行爬虫开发时,应遵守目标网站的 robots.txt 文件规定,尊重网站的爬虫策略。
  • 合理设置抓取间隔:为了避免对目标网站造成过大压力,应设置合理的抓取间隔和重试次数。
  • 异常处理:网络请求可能会失败,需要在代码中进行适当的异常处理。

4.7、示例代码

如果你使用的是 Maven,可以在 pom.xml 文件中添加以下依赖


<!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-core -->
<!-- WebMagic是一个简单灵活的爬虫框架,其核心部分(webmagic-core)是一个精简的、模块化的爬虫实现。 -->
<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-core</artifactId>
    <version>0.9.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-extension -->
<!-- WebMagic的扩展模块(webmagic-extension)为使用者提供了更方便的编写爬虫的工具,包括注解格式定义爬虫、JSON、分布式等支持。 -->
<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-extension</artifactId>
    <version>0.9.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-selenium -->
<!-- WebMagic 是一个基于 Java 的开源网络爬虫框架,而 Selenium 是一个用于自动化 Web 浏览器的工具。 -->
<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-selenium</artifactId>
    <version>0.9.0</version>
</dependency>

以下是一个简单的 WebMagic 示例代码,演示了如何抓取百度首页上的热门搜索新闻:

1、自定义下载器

WebMagic-Selenium 是 WebMagic 爬虫框架的一个扩展,它结合了 WebMagic 的爬虫能力和 Selenium 的浏览器自动化功能。这种结合使得 WebMagic-Selenium 能够处理那些需要执行 JavaScript 或模拟用户交互才能获取完整信息的动态网页。

通过使用 WebMagic-Selenium,开发者可以利用 WebMagic 的简洁 API 来定义爬虫的抓取逻辑,同时使用 Selenium 来处理那些需要复杂交互的网页。例如,可以模拟用户的登录过程、处理弹出窗口、执行复杂的表单提交等操作。

WebMagic 默认使用了 Apache HttpClient 作为下载工具。

/**
 * <h1>自定义下载器</h1>
 * Downloader 负责从互联网上下载页面,以便后续处理。
 * WebMagic 默认使用了Apache HttpClient作为下载工具。
 * */
public class WNDownloader implements Downloader {

    // 声明驱动
    private RemoteWebDriver driver;

    @Override
    public Page download(Request request, Task task) {
        // 第一个参数是使用哪种浏览器驱动,第二个参数是浏览器驱动的地址
        System.setProperty("webdriver.chrome.driver",
                "/Users/yaoshuaizhou/Downloads/chromedriver-mac-arm64/chromedriver");

        // 创建浏览器参数对象
        ChromeOptions chromeOptions = new ChromeOptions();

        // 设置为 无界面浏览器 模式,若是不想看到浏览器打开,就可以配置此项
        // chromeOptions.addArguments("--headless");

        chromeOptions.addArguments("--window-size=1440,1080"); // 设置浏览器窗口打开大小

        this.driver = new ChromeDriver(chromeOptions); // 创建驱动

        driver.get(request.getUrl()); // 第一次打开url,跳转到登录页

        try {
            Thread.sleep(3000); // 等待打开浏览器

            // 获取从process返回的site携带的cookies,填充后第二次打开url

            Site site = task.getSite();

            if (site.getCookies() != null) {

//                for (Map.Entry cookieEntry : site.getCookies()
//
//                        .entrySet()) {
//
//                    Cookie cookie = new Cookie(cookieEntry.getKey(),
//
//                            cookieEntry.getValue());
//
//                    driver.manage().addCookie(cookie);
//
//                }

                // 添加对应domain的cookie后,第二次打开url

                driver.get(request.getUrl());

            }

            Thread.sleep(2000);

            // 需要滚动到页面的底部,获取完整的数据
            driver.executeScript("window.scrollTo(0, document.body.scrollHeight - 1000)");

            Thread.sleep(2000); // 等待滚动完成

            // 获取页面,打包成Page对象,传给PageProcessor 实现类

            Page page = createPage(request.getUrl(), driver.getPageSource());

            driver.close(); // 看需要是否关闭浏览器

            return page;
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void setThread(int i) {

    }

    //构建page返回对象

    private Page createPage(String url, String content) {

        Page page = new Page();

        page.setRawText(content);

        page.setUrl(new PlainText(url));

        page.setRequest(new Request(url));

        page.setDownloadSuccess(true);

        return page;
    }
}

2、自定义页面解析器

/**
 * <h1>自定义页面解析器</h1>
 * PageProcessor 负责解析页面,抽取有用信息,以及发现新的链接。
 * WebMagic 使用 Jsoup 作为 HTML 解析工具,并基于其开发了解析 XPath 的工具 Xsoup。
 * */
public class WNPageProcessor implements PageProcessor {

    private Site site = Site.me()
            .setCharset("UTF-8") // 设置编码
            .setSleepTime(1) // 抓取间隔时间
            .setTimeOut(1000 * 10) // 超时时间
            .setRetrySleepTime(3000) // 重试时间
            .setRetryTimes(3)
            .addHeader("CSDN", "woniu")
            .addHeader("Content-Type", "application/json;charset=UTF-8");

    @Override
    public void process(Page page) {
        Html html = page.getHtml();

        List<Selectable> hotSearchList = html.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li").nodes();
        System.out.println("今日百度热搜:");
        // 遍历所有热搜新闻
        for (Selectable hotSearch : hotSearchList){
            List<Selectable> newsMetaList = hotSearch.xpath("//span/text()").nodes();
            for (Selectable newsMeta : newsMetaList) {
                System.out.print(newsMeta.get() + " ");
            }
            System.out.print("\n");
        }

        // 存储,可以传递到 WNPipeline
        page.putField("woniu", "我是CSDN");
    }

    @Override
    public Site getSite() {
        return site;
    }
}

3、自定义结果处理器

/**
 * <h1>自定义结果处理器</h1>
 * Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。
 * WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。
 * Pipeline定义了结果保存的方式,如果你要保存到指定数据库,则需要编写对应的Pipeline。
 * 对于一类需求一般只需编写一个Pipeline。
 * */
public class WNPipeline implements Pipeline {

    @Override
    public void process(ResultItems resultItems, Task task) {
        // 获取封装好的数据
        String woniu = resultItems.get("woniu");
        System.out.println("WNPageProcessor 传递结果:" + woniu);
    }
}

4、单元测试

public class WebMagicExample {
    public static void main(String[] args) {
        // 目标网页 URL
        String url = "https://www.baidu.com";

        Spider.create(new WNPageProcessor())  // 创建爬虫,并指定PageProcessor
                .addUrl(url) // 添加需要爬取的URL
                .setDownloader(new WNDownloader()) // 设置 Downloader,一个 Spider 只能有个一个 Downloader
                .addPipeline(new WNPipeline()) // 添加一个 Pipeline,一个 Spider 可以有多个 Pipeline
                .thread(5) // 开启5个线程抓取
                .start(); // 开始爬取,设置最多在10分钟内停止
    }
}

Selenium 可以配置为两种模式运行:有界面(headed)和无界面(headless)。

在默认情况下,Selenium WebDriver 会启动一个完整的浏览器窗口,用户可以直观地看到浏览器中的操作和页面变化,这对于测试和调试非常有用。如下图:

在这里插入图片描述

要启动无界面模式,需要在 Selenium 的浏览器配置中添加相应的参数。例如,在 Java 中使用ChromeDriver 时,可以通过以下代码启动无界面模式:

// 创建浏览器参数对象
ChromeOptions chromeOptions = new ChromeOptions();

// 设置为无界面浏览器模式,若是不想看到浏览器打开,就可以配置此项
chromeOptions.addArguments("--headless");

这段代码会启动一个没有图形界面的 Chrome 浏览器,并打开指定的网址。在无界面模式下,所有的 Selenium 操作都会正常执行,但不会有任何视觉反馈。

运行结果截图如下:

在这里插入图片描述

5、知识库

5.1、Chrome 浏览器查找 html 元素中的 XPath 路径

在谷歌 Chrome 浏览器中查找 HTML 元素的 XPath 路径,可以通过以下步骤进行:

5.1.1、打开开发者工具

使用快捷键 Ctrl + Shift + I 或 F12 打开 Chrome 的开发者工具,或者在页面上右键点击,选择“检查”来打开。

5.1.2、切换到Elements面板

在开发者工具中,默认选中的是 “元素(Elements)” 面板,这里可以查看页面的 DOM 结构。

5.1.3、选择目标元素

使用鼠标点击页面上的目标元素,或者使用开发者工具中的选择器工具(点击左上角的小箭头图标后,鼠标变为一个箭头状)来选择页面上的元素。

5.1.4、复制 XPath 路径

在元素(Elements)面板中,选中目标元素后,右键点击该元素的代码行,在弹出的菜单中选择“复制” > “复制 XPath”来复制 XPath 路径。如果想要复制完整的 XPath 路径(从根节点开始),可以选择“复制” > “复制完整 XPath”。

在这里插入图片描述

5.1.5、验证 XPath 路径

在开发者工具的控制台(Console)面板中,可以使用 XPath 表达式来验证路径是否正确。例如,输入$x(‘//XPath 表达式’)并回车,如果路径正确,控制台会输出匹配的元素数量

示例:$x(‘//*[@id=“hotsearch-content-wrapper”]’),如下图:

在这里插入图片描述

5.2、ChromeDriver 下载

ChromeDriver 下载地址,请根据您使用的操作系统下载相应的 ChromeDriver 版本。

在这里插入图片描述

6、总结

Jsoup 主要用于抓取和解析静态 HTML 页面,它不执行 JavaScript,因此对于依赖 JavaScript动态加载内容的网站可能无法获取完整的页面信息。而 HtmlUnit 和 WebMagic 则具备处理动态网页的能力。

HtmlUnit 是一个无头浏览器,它可以执行 JavaScript 代码,从而允许用户与动态内容进行交互,获取通过 JavaScript 动态加载的数据。这使得 HtmlUnit 非常适合抓取那些需要执行脚本才能显示完整内容的网站。

WebMagic 作为一个爬虫框架,它不仅支持静态页面的抓取,也能够通过内置的或自定义的处理器来处理动态内容。WebMagic 的多线程和分布式特性使其在大规模数据抓取方面表现出色,尤其适合于处理复杂的动态网站。

因此,在选择工具时,如果目标网站主要是静态内容,Jsoup 可能是一个简单且高效的选择。而如果网站包含大量的动态内容,HtmlUnit 和 WebMagic 将更能满足需求。

综上所述,Jsoup、HtmlUnit 和 WebMagic 各有千秋,它们分别适用于不同的网页抓取场景。通过合理选择和应用这些工具,开发者可以大幅提升工作效率,优化项目质量,从而在网络爬虫的开发之旅中取得成功。无论您的项目需求如何,这三款工具都能为您提供强大的支持,助您轻松应对网络数据抓取的挑战。

本文教程到此结束,祝愿小伙伴们在编程之旅中能够愉快地探索、学习、成长!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文读懂CSS中的阴影:box-shadow,text-shadow,drop-shadow的区别与使用方式

一、区别 box-shadow 应用于元素&#xff0c;为元素本身添加阴影效果。 text-shadow 应用于文本&#xff0c;为文本内容添加阴影效果。 drop-shadow 是filter属性的一部分&#xff0c;通常用于图像&#xff0c;为其添加阴影效果。 二、box-shadow box-shadow属性用于为元素&…

stable-diffusion-webui怎么样增加自己训练的LoRA模型?

不怕笑话,我曾经为了找这个功能,居然搞了半天时间,结果还没有搞定。 后来再不断地研究各种教程,就是没有发现这个功能,无意间发现有一个人贴了一张图片, 他只是介绍放到这个目录,他没有告诉我这个目录怎么样来的,因为我在同样的位置上没有这个目录。 这样我训练出来…

【数据结构】考研真题攻克与重点知识点剖析 - 第 5 篇:树与二叉树

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

网站想使用https安全协议,必须要安装ssl证书吗?

ssl证书作为保护网站数据传输安全的重要工具&#xff0c;被广泛应用于网站的安全加密通信中。很多人在初次接触ssl证书时&#xff0c;有一个常见的疑问&#xff1a;网站使用https协议必须要ssl证书吗&#xff1f; 答案是肯定的。   HTTPS是一种通过计算机网络进行安全通信的…

MongoDB基本操作之备份与恢复【验证有效】

资源获取 MongoDB Database Tools 解压zip包&#xff0c;将其中的工具复制到bin目录下 mongodump与mongorestore – 备份 mongodump -h localhost:27017 -u admin -p pass --authenticationDatabase admin -d runoob -o /usr/local/mongo/bak/ --forceTableScan –切换数据库…

怎么防止文件被拷贝,复制别人拷贝电脑文件

怎么防止文件被拷贝&#xff0c;复制别人拷贝电,脑文件 防止文件被拷贝通常是为了保护敏感数据、知识产权或商业秘密不被未经授权的人员获取或传播。以下列出了一系列技术手段和策略&#xff0c;可以帮助您有效地防止文件被拷贝。 1. 终端管理软件&#xff1a; 如安企神、域智…

内网穿透的应用-如何使用Docker本地部署Dify LLM结合内网穿透实现公网访问本地开发平台

文章目录 1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 本文主要介绍如何在Linux Ubuntu系统以Docker的方式快速部署Dify,并结合cpolar内网穿透工具实现公网远程访问本地Dify&#xff01; Dify 是一款…

(表征学习论文阅读)A Simple Framework for Contrastive Learning of Visual Representations

Chen T, Kornblith S, Norouzi M, et al. A simple framework for contrastive learning of visual representations[C]//International conference on machine learning. PMLR, 2020: 1597-1607. 1. 前言 本文作者为了了解对比学习是如何学习到有效的表征&#xff0c;对本文所…

Vscode 中调试Django程序

调试介绍: ​​​​​​​Explore the debugger Debug/调试 可以让我们在特定的代码行上暂停程序的运行。当程序暂停时&#xff0c;我们可以查看变量的数值&#xff0c;在“Debug控制台”中运行代码&#xff0c;或利用“Debug”工具提供的其他功能。启动Debugger/调试器会自动…

MAC苹果电脑如何使用Homebrew安装iperf3

一、打开mac终端 找到这个终端打开 二、终端输入安装Homebrew命令 Homebrew官网地址&#xff1a;https://brew.sh/ 复制这个命令粘贴到mac的终端窗口&#xff0c;然后按回车键 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/in…

rsync实时同步(上行同步)

目录 一、实现实时同步 1. 定期同步的不足 2. 实时同步的优点 3. Linux内核的inotify机制 4. 发起端配置rsyncinotify 4.1 修改rsync源服务器配置文件 4.2 调整inotify内核参数 4.3 安装inotify-tools 4.4 在另一个终端编写触发式同步脚本 4.5 验证 二、使用rsync实现…

电脑与多台罗克韦尔AB PLC无线通讯的搭建方法分为几步?

在实际系统中&#xff0c;同一个车间里分布多台PLC&#xff0c;通过上位机集中控制。通常所有设备距离在几十米到上百米不等。在有通讯需求的时候&#xff0c;如果布线的话&#xff0c;工程量较大耽误工期&#xff0c;这种情况下比较适合采用无线通信方式。本方案以组态王和2台…

WinForm用微软打包工具打包

WinForm用微软打包工具打包 1. 安装扩展 下载扩展Microsoft Visual Studio Installer Projects 点击扩展 —> 管理扩展 安装完之后重启VS就好了。 2. 新建Set up项目 点击解决方案 —> 添加 —> 新建项目 选择这个Setup Project 创建打包项目 安装项目&…

nandgame中的asm编程PUSH_VALUE、ADD、SUB、NEG、AND、OR

参考&#xff1a;https://zhuanlan.zhihu.com/p/613188641 PUSH_VALUE题目说明及答案 将值推送到堆栈上。 提示&#xff1a;该值将作为宏的替换值提供&#xff0c;但在测试时&#xff0c;您可以在“测试工具”框中设置该值。现在&#xff0c;我们引入了一个使用占位符的宏。宏…

nginx This request has been blocked; the content must be served over HTTPS问题处理

This request has been blocked; the content must be served over HTTPS问题处理 1.问题现象2.解决问题3.解决后的现象4.proxy_set_header x-forwarded-proto 作用 1.问题现象 Mixed Content: The page at https://www.ssjxx.cn/ssjy/viy-edu/index.html?systemCodeTW0010#/…

iOS-获取Xcode工程中文件的路径

1、使用Create folder references的Add folders的方式把文件或者文件夹拖到Xcode工程中 拖入时的设置参考下图 注意拖入到工程之后文件夹是蓝色的&#xff08;Xcode10.1环境&#xff09; 2、代码具体实现&#xff1a; 使用NSBundle的API&#xff0c;然后拼接具体路径即可 NS…

区块链与数字身份:探索Facebook的新尝试

在数字化时代&#xff0c;随着区块链技术的崛起&#xff0c;数字身份成为了一个备受关注的话题。作为全球最大的社交媒体平台之一&#xff0c;Facebook一直在探索如何利用区块链技术来改善数字身份管理和用户数据安全。本文将深入探讨Facebook在这一领域的新尝试&#xff0c;探…

【ArcGIS微课1000例】0109:ArcGIS计算归一化水体指数(NDWI)

文章目录 一、加载数据二、归一化水体指数介绍三、归一化水体指数计算四、注意事项一、加载数据 加载配套数据0108.rar(本实验的数据与0108的一致)中的Landsat8的8个单波段数据,如下所示: Landsat8波段信息对照表如下表所示: 接下来学习在ArcGIS平台上,基于Landsat8数据…

GPT-4对多模态大模型在多模态预训练、 理解生成上的启发

传统人工智能 模型往往依赖大量有标签数据的监督训练,而且一个模型一般只能解决一个任务,仅适用于单一场景, 这使得人工智能的研发和应用成本高,场景适应能力弱,难以规模化应用。 常见的多模态任务大致可以分为两类: 多模态理解任务,如视频 分类、视觉问答、跨模态检索、指代…

5G如何助力物流智能化转型

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;你的老朋友&#xff0c;老K。行业群 新书《智能物流系统构成与技术实践》人俱乐部 整版PPT和更多学习资料&#xff0c;请球友到知识星球 【智能仓储物流技术研习社】自行下载 智能制造-话题精读 1、西门子…