[Selenium] 通过Java+Selenium查询某个博主的Top40文章质量分

news2024/11/18 21:47:03

系列文章目录

通过Java+Selenium查询文章质量分
通过Java+Selenium查询某个博主的Top40文章质量分


文章目录

  • 系列文章目录
  • 前言
  • 一、环境准备
  • 二、查询某个博主的Top40文章
    • 2.1、修改pom.xml配置
    • 2.2、配置Chrome驱动
    • 2.3、引入浏览器配置
    • 2.4、设置无头模式
    • 2.5、启动浏览器实例,添加配置信息
    • 2.6、窗口设置
    • 2.7、禁止加载图片设置
    • 2.8、加载博主地址
    • 2.9、加载文章列表
    • 2.10、加载下一页
    • 2.11、设置加载40条数据
    • 2.12、成果
  • 三、循环查询文章质量分
  • 四、代码
  • 总结

在这里插入图片描述


前言

大家好,我是青花,本篇给大家分享一下《通过Java+Selenium查询某个博主的Top40文章质量分》。


一、环境准备

浏览器:本篇使用的是Chrome
Chrome浏览器版本:113
Chrome驱动版本:113(Java爬虫第一篇)
Java版本:Jdk1.8
selenium版本: 4.9.1


二、查询某个博主的Top40文章

2.1、修改pom.xml配置

	 <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
     <dependency>
         <groupId>org.jsoup</groupId>
         <artifactId>jsoup</artifactId>
         <version>1.11.3</version>
     </dependency>

     <dependency>
         <groupId>org.seleniumhq.selenium</groupId>
         <artifactId>selenium-java</artifactId>
         <version>4.9.1</version>
     </dependency>
     
     <dependency>
         <groupId>com.google.code.gson</groupId>
         <artifactId>gson</artifactId>
         <version>2.10.1</version>
     </dependency>

2.2、配置Chrome驱动

	public final static String CHROMEDRIVERPATH = "/Users/apple/Downloads/chromedriver_mac64/chromedriver";
	System.setProperty("webdriver.chrome.driver", SeleniumUtil.CHROMEDRIVERPATH );//    	chromedriver localPath

2.3、引入浏览器配置

	 WebDriver driver;
	 ChromeOptions chromeOptions = new ChromeOptions();

2.4、设置无头模式

	chromeOptions.addArguments('--headless')
	chromeOptions.addArguments("--remote-allow-origins=*");

2.5、启动浏览器实例,添加配置信息

	driver = new ChromeDriver(chromeOptions);

2.6、窗口设置

	chromeOptions.addArguments("–no-sandbox");  //--start-maximized

2.7、禁止加载图片设置

	// 增加禁止加载图片的设置
   	HashMap<String, Object> prefs = new HashMap<>();
    prefs.put("profile.default_content_settings", 2);
    chromeOptions.setExperimentalOption("prefs", prefs);
    chromeOptions.addArguments("blink-settings=imagesEnabled=false");//禁用图片

2.8、加载博主地址

 	String baseUrl = "https://blog.csdn.net/s445320?type=blog";

在这里插入图片描述

2.9、加载文章列表

   //定位到文章列表
   WebElement mainSelectE = driver.findElement(By.cssSelector("div.mainContent"));

2.10、加载下一页

模拟浏览器滚动条下拉,加载下一页数据

   //加载下一页
   JavascriptExecutor jsDriver = (JavascriptExecutor) driver;//将java中的driver强制转型为JS类型
   jsDriver.executeScript("window.scrollTo(0, 50)");
   jsDriver.executeScript("window.scrollTo(0, document.body.scrollHeight-20)");
   SeleniumUtil.sleep(500);
   jsDriver.executeScript("window.scrollTo(0, document.body.scrollHeight +1)");
   SeleniumUtil.sleep(2000);

2.11、设置加载40条数据

 	// 获取Top40的数量
    int topNum = 40;
        
	//如果加载的数据超过或等于 要求的最大长度,返回现在已加载的数据
    if( webElements.size() >= topNum ) {
        for(WebElement element : webElements ){
            System.out.println(  element.getAttribute("href")  );
            blogUrlList.add(element.getAttribute("href"));
        }
        log.info("文章已读取 {} 条,最大限制 {} 条!" , webElements.size() , topNum);
        break;
    }

2.12、成果


00:44:50.693 [main] INFO com.kelvin.spiderx.service.CsdnQcService - csdnQcBySelenium start!
00:45:03.151 [main] INFO com.kelvin.spiderx.service.CsdnQcService - 文章已读取 40 条,最大限制 40 条!
00:45:03.151 [main] INFO com.kelvin.spiderx.service.CsdnQcService - blogUrlList size:40
00:45:03.294 [main] INFO com.kelvin.spiderx.service.CsdnQcService - blogUrlList:["https://blog.csdn.net/s445320/article/details/131347069","https://blog.csdn.net/s445320/article/details/131339468","https://blog.csdn.net/s445320/article/details/131339215","https://blog.csdn.net/s445320/article/details/131338267","https://blog.csdn.net/s445320/article/details/131336229","https://blog.csdn.net/s445320/article/details/131336089","https://blog.csdn.net/s445320/article/details/131333724","https://blog.csdn.net/s445320/article/details/131332238","https://blog.csdn.net/s445320/article/details/131290150","https://blog.csdn.net/s445320/article/details/131250793","https://blog.csdn.net/s445320/article/details/131212215","https://blog.csdn.net/s445320/article/details/131189920","https://blog.csdn.net/s445320/article/details/131156242","https://blog.csdn.net/s445320/article/details/131154914","https://blog.csdn.net/s445320/article/details/131150756","https://blog.csdn.net/s445320/article/details/131147965","https://blog.csdn.net/s445320/article/details/131132334","https://blog.csdn.net/s445320/article/details/131119648","https://blog.csdn.net/s445320/article/details/130951405","https://blog.csdn.net/s445320/article/details/130930596","https://blog.csdn.net/s445320/article/details/130928675","https://blog.csdn.net/s445320/article/details/130888590","https://blog.csdn.net/s445320/article/details/130888380","https://blog.csdn.net/s445320/article/details/130887969","https://blog.csdn.net/s445320/article/details/130887448","https://blog.csdn.net/s445320/article/details/130885855","https://blog.csdn.net/s445320/article/details/130840157","https://blog.csdn.net/s445320/article/details/130830753","https://blog.csdn.net/s445320/article/details/130826012","https://blog.csdn.net/s445320/article/details/130823776","https://blog.csdn.net/s445320/article/details/130822527","https://blog.csdn.net/s445320/article/details/130822065","https://blog.csdn.net/s445320/article/details/130820814","https://blog.csdn.net/s445320/article/details/130807205","https://blog.csdn.net/s445320/article/details/130800407","https://blog.csdn.net/s445320/article/details/130717739","https://blog.csdn.net/s445320/article/details/130690514","https://blog.csdn.net/s445320/article/details/130690100","https://blog.csdn.net/s445320/article/details/130635327","https://blog.csdn.net/s445320/article/details/130624259"]
00:45:03.296 [main] INFO com.kelvin.spiderx.service.CsdnQcService - 此博主有文章,开始解析文章质量分!
00:45:03.296 [main] INFO com.kelvin.spiderx.service.CsdnQcService - csdnQcBySelenium start!
---------- 省略解析过程
此博主质量分如下:
00:50:40.699 [main] INFO com.kelvin.spiderx.service.CsdnQcService - [{"title":"[Selenium] 通过Java+Selenium查询文章质量分","posttime":"- 青花锁 · 2023-06-23 08:42:36 -","score":"86","remark":"文章质量良好"},{"title":"【并发知识点】CAS的实现原理及应用","posttime":"- 青花锁 · 2023-06-22 11:55:48 -","score":"90","remark":"文章质量良好"},{"title":"【并发知识点】AQS的实现原理及应用","posttime":"- 青花锁 · 2023-06-22 11:35:53 -","score":"90","remark":"文章质量良好"},{"title":"简单介绍html/javascript、ajax应用","posttime":"- 青花锁 · 2023-06-22 10:18:01 -","score":"92","remark":"文章质量良好"},{"title":"[设计模式] OOP六大原则","posttime":"- 青花锁 · 2023-06-22 01:24:19 -","score":"89","remark":"文章质量良好"},{"title":"[Web前端] Servlet及应用","posttime":"- 青花锁 · 2023-06-22 01:07:56 -","score":"91","remark":"文章质量良好"},{"title":"【在线商城系统】数据来源-爬虫篇","posttime":"- 青花锁 · 2023-06-22 00:48:46 -","score":"87","remark":"文章质量良好"},{"title":"《项目实战》构建SpringCloud alibaba项目(三、构建服务方子工程store-user-service)","posttime":"- 青花锁 · 2023-06-21 18:20:46 -","score":"86","remark":"文章质量良好"},{"title":"《项目实战》构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service)","posttime":"- 青花锁 · 2023-06-19 17:24:53 -","score":"86","remark":"文章质量良好"},{"title":"《项目实战》使用JDBC手写分库","posttime":"- 青花锁 · 2023-06-16 17:56:03 -","score":"88","remark":"文章质量良好"},{"title":"《项目实战》构建SpringCloud alibaba项目(一、构建父工程、公共库、网关))","posttime":"- 青花锁 · 2023-06-15 20:41:46 -","score":"92","remark":"文章质量良好"},{"title":"《项目实战》 Jenkins 与 CICD、发布脚本","posttime":"- 青花锁 · 2023-06-13 15:53:46 -","score":"90","remark":"文章质量良好"},{"title":"《微服务实战》 第三十二章 微服务链路跟踪-sleuth zipkin","posttime":"- 青花锁 · 2023-06-11 18:41:09 -","score":"90","remark":"文章质量良好"},{"title":"《微服务实战》 第三十一章 ShardingSphere - ShardingSphere-JDBC","posttime":"- 青花锁 · 2023-06-11 18:25:34 -","score":"80","remark":"文章质量良好"},{"title":"《微服务实战》 第三十章 分布式事务框架seata TCC模式","posttime":"- 青花锁 · 2023-06-11 10:38:21 -","score":"89","remark":"文章质量良好"},{"title":"《微服务实战》 第二十九章 分布式事务框架seata AT模式","posttime":"- 青花锁 · 2023-06-11 10:23:44 -","score":"92","remark":"文章质量良好"},{"title":"《微服务实战》 第二十八章 分布式锁框架-Redisson","posttime":"- 青花锁 · 2023-06-09 17:55:59 -","score":"91","remark":"文章质量良好"},{"title":"【项目实战】一、Spring boot整合JWT、Vue案例展示用户鉴权","posttime":"- 青花锁 · 2023-06-09 09:06:43 -","score":"92","remark":"文章质量良好"},{"title":"《微服务实战》 第二十七章 CAS","posttime":"- 青花锁 · 2023-05-30 16:26:30 -","score":"87","remark":"文章质量良好"},{"title":"《微服务实战》 第二十六章 Java锁的分类","posttime":"- 青花锁 · 2023-05-29 17:28:47 -","score":"91","remark":"文章质量良好"},{"title":"《微服务实战》 第二十五章 Java多线程安全与锁","posttime":"- 青花锁 · 2023-05-29 16:07:53 -","score":"91","remark":"文章质量良好"},{"title":"《微服务实战》 第二十四章 Spring boot 操作 Redis","posttime":"- 青花锁 · 2023-05-26 15:58:06 -","score":"84","remark":"文章质量良好"},{"title":"《微服务实战》 第二十三章 Redis RDB AOF","posttime":"- 青花锁 · 2023-05-26 15:51:44 -","score":"87","remark":"文章质量良好"},{"title":"《微服务实战》 第二十一、二十二章 Redis发布订阅、事务;HyperLoglog基数统计","posttime":"- 青花锁 · 2023-05-26 15:37:14 -","score":"87","remark":"文章质量良好"},{"title":"《微服务实战》 第二十章 Redis连接指令 客户端指令 服务器指令","posttime":"- 青花锁 · 2023-05-26 15:23:09 -","score":"89","remark":"文章质量良好"},{"title":"《微服务实战》 第十九章 Redis key","posttime":"- 青花锁 · 2023-05-26 14:21:22 -","score":"85","remark":"文章质量良好"},{"title":"《微服务实战》 第十八章 Redis查看配置文件和数据类型","posttime":"- 青花锁 · 2023-05-26 14:13:58 -","score":"91","remark":"文章质量良好"},{"title":"《微服务实战》 第十七章 Redis下载与安装","posttime":"- 青花锁 · 2023-05-23 17:09:55 -","score":"85","remark":"文章质量良好"},{"title":"《微服务实战》 第十六章 Spring cloud stream应用","posttime":"- 青花锁 · 2023-05-23 15:17:00 -","score":"89","remark":"文章质量良好"},{"title":"《微服务实战》 第十五章 RabbitMQ 延迟队列","posttime":"- 青花锁 · 2023-05-23 11:35:33 -","score":"86","remark":"文章质量良好"},{"title":"《微服务实战》 第十四章 RabbitMQ应用","posttime":"- 青花锁 · 2023-05-23 11:25:54 -","score":"92","remark":"文章质量良好"},{"title":"Java爬虫第五篇:使用selenium、Jsoup 抓取bing搜索图片","posttime":"- 青花锁 · 2023-05-23 10:39:34 -","score":"13","remark":"文章过短"},{"title":"Java爬虫第四篇:使用selenium、Jsoup 抓取图片","posttime":"- 青花锁 · 2023-05-23 10:04:52 -","score":"13","remark":"文章过短"},{"title":"《微服务实战》 第十三章 JWT","posttime":"- 青花锁 · 2023-05-22 15:54:20 -","score":"92","remark":"文章质量良好"},{"title":"《微服务实战》 第十二章 Spring Cloud Alibaba Sentinel","posttime":"- 青花锁 · 2023-05-22 11:48:27 -","score":"92","remark":"文章质量良好"},{"title":"《微服务实战》 第十一章 Spring Cloud Alibaba nacos配置中心","posttime":"- 青花锁 · 2023-05-17 09:01:39 -","score":"88","remark":"文章质量良好"},{"title":"《微服务实战》 第九章 Gitlab使用","posttime":"- 青花锁 · 2023-05-15 18:54:13 -","score":"80","remark":"文章质量良好"},{"title":"《微服务实战》 第八章 Spring Cloud 之 Hystrix","posttime":"- 青花锁 · 2023-05-15 18:36:19 -","score":"91","remark":"文章质量良好"},{"title":"《微服务实战》 第七章 Spring Cloud 之 GateWay","posttime":"- 青花锁 · 2023-05-15 14:20:09 -","score":"92","remark":"文章质量良好"},{"title":"《微服务实战》 第六章 Spring Cloud 之 OpenFeign","posttime":"- 青花锁 · 2023-05-11 17:07:56 -","score":"90","remark":"文章质量良好"}]

00:50:40.693 [main] INFO com.kelvin.spiderx.service.CsdnQcService - csdnQcBySelenium end!

三、循环查询文章质量分

通过Java+Selenium查询文章质量分
查询文章质量分可见上述文章,在本章中对返回值,禁止图片加载做了优化。
备注: 后期针对查询质量分,可以多个查询页面共用一个driver。
并发情况下,可考虑driver池化技术,100篇文章分为N段,分别去作业,优化性能。


四、代码

	
```java
package com.kelvin.spiderx.service;

import com.google.gson.Gson;
import com.kelvin.spiderx.util.SeleniumUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/***
 * @title CsdnQcService
 * @desctption CSDN查询质量分
 * @author LTF
 * @create 2023/6/21 23:02
 **/
@Slf4j
public class CsdnQcService {

    @Data
    class CsdnBlogInfo {
        private String title;

        private String posttime;

        private String score;

        private String remark;

    }

    /**
     *  获取商品数据
     * @throws IOException
     */
    CsdnBlogInfo csdnQcBySelenium(String blogUrl) {
        log.info("csdnQcBySelenium start!");
        CsdnBlogInfo csdnBlogInfo = new CsdnBlogInfo();


        System.setProperty("webdriver.chrome.driver", SeleniumUtil.CHROMEDRIVERPATH );// chromedriver localPath
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.addArguments("--remote-allow-origins=*");
        chromeOptions.addArguments("–no-sandbox");  //--start-maximized

        // 增加禁止加载图片的设置
        HashMap<String, Object> prefs = new HashMap<>();
        prefs.put("profile.default_content_settings", 2);
        chromeOptions.setExperimentalOption("prefs", prefs);
        chromeOptions.addArguments("blink-settings=imagesEnabled=false");//禁用图片


        WebDriver driver = new ChromeDriver(chromeOptions);

        driver.get("https://www.csdn.net/qc");

        SeleniumUtil.sleep(1000);

        //定位到输入框
        WebElement inputSelectE = driver.findElement(By.cssSelector("input.el-input__inner"));
        //输入文字地址
        inputSelectE.sendKeys(blogUrl);

        SeleniumUtil.sleep(100);

        //定位查询按钮
        WebElement qcSelectE = driver.findElement(By.cssSelector("div.trends-input-box-btn"));
        //点击查询按钮
        qcSelectE.click();

        SeleniumUtil.sleep(1000);

        //获取右边区域 -- 文章质量分结果区域
        WebElement mainSelectE = driver.findElement(By.cssSelector("div.csdn-body-right"));

        //转化为Jsoup文档处理
        Document doc = Jsoup.parse( mainSelectE.getAttribute("outerHTML") );

        //获取文章标题
        String title = doc.select("span.title").text();
        if(!StringUtils.isEmpty(title)) {
            csdnBlogInfo.setTitle(title);
        }

        //获取作者和发布时间
        String posttime = doc.select("span.name").text();
        if(!StringUtils.isEmpty(posttime)) {
            csdnBlogInfo.setPosttime(posttime);
        }

        //获取质量分
        String score = doc.select("p.img").text();
        if(!StringUtils.isEmpty(score)) {
            csdnBlogInfo.setScore(score);
        }

        //获取博文质量分建议
        String remark = doc.select("p.desc").text();
        if(!StringUtils.isEmpty(remark)) {
            csdnBlogInfo.setRemark(remark);
        }

        //打印结果
        log.info("文章标题:{} , 作者和发布时间:{} , 质量分:{} , 博文建议:{}" , title , posttime , score , remark );

        driver.quit();
        log.info("csdnQcBySelenium end!");
        return csdnBlogInfo;
    }

    void allBlogQcDataBySelenium() {
        String baseUrl = "https://blog.csdn.net/s445320?type=blog";
        String qcUrl = "https://www.csdn.net/qc";

        System.setProperty("webdriver.chrome.driver", SeleniumUtil.CHROMEDRIVERPATH );// chromedriver localPath
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.addArguments("--remote-allow-origins=*");
        chromeOptions.addArguments("–no-sandbox");  //--start-maximized

        // 增加禁止加载图片的设置
        HashMap<String, Object> prefs = new HashMap<>();
        prefs.put("profile.default_content_settings", 2);
        chromeOptions.setExperimentalOption("prefs", prefs);
        chromeOptions.addArguments("blink-settings=imagesEnabled=false");//禁用图片

        WebDriver driver = new ChromeDriver(chromeOptions);

        driver.get(baseUrl);

        SeleniumUtil.sleep(200);

        //定位到文章列表
        WebElement mainSelectE = driver.findElement(By.cssSelector("div.mainContent"));

        boolean isEnd = false;
        // 获取Top40的数量
        int topNum = 40;
        // 上一次读取的文章数
        int prePoint = 0;
        // 已读取的文章数量
        int readNum = 0;
        List<String> blogUrlList = new ArrayList<>();
        List<WebElement>  webElements = null;
        while ( isEnd == false  ) {
            JavascriptExecutor jsDriver = (JavascriptExecutor) driver;//将java中的driver强制转型为JS类型
            jsDriver.executeScript("window.scrollTo(0, 50)");
            jsDriver.executeScript("window.scrollTo(0, document.body.scrollHeight-20)");
            SeleniumUtil.sleep(500);
            jsDriver.executeScript("window.scrollTo(0, document.body.scrollHeight +1)");
            SeleniumUtil.sleep(2000);

            webElements = mainSelectE.findElements(By.cssSelector("article.blog-list-box>a"));

            // 如果上一次的文章数
            //    等于 当前页面的文章数:文章已全部读取完
            //    否则,继续加载下一页
            if( webElements.size() == prePoint){
                for(WebElement element : webElements ){
                    System.out.println(  element.getAttribute("href")  );
                    blogUrlList.add(element.getAttribute("href"));
                }
                log.info("文章已全部读取完");
                break;
            } else {
                prePoint = webElements.size();
            }

            //如果加载的数据超过或等于 要求的最大长度,返回现在已加载的数据
            if( webElements.size() >= topNum ) {
                for(WebElement element : webElements ){
                    System.out.println(  element.getAttribute("href")  );
                    blogUrlList.add(element.getAttribute("href"));
                }
                log.info("文章已读取 {} 条,最大限制 {} 条!" , webElements.size() , topNum);
                break;
            }
        }
        log.info("blogUrlList size:{}" , blogUrlList.size());
        log.info("blogUrlList:{}" , new Gson().toJson(blogUrlList) );

        List<CsdnBlogInfo> csdnBlogInfoList = null;
        if(CollectionUtils.isEmpty(blogUrlList)) {
            log.info("此博主没有发表文章!");
        } else {
            log.info("此博主有文章,开始解析文章质量分!");
            csdnBlogInfoList = new ArrayList<>();
            for (String blogUrl : blogUrlList) {
                try{
                    CsdnBlogInfo csdnBlogInfo = this.csdnQcBySelenium(blogUrl);
                    if( null != csdnBlogInfo ) {
                        csdnBlogInfoList.add(csdnBlogInfo);
                    }
                } catch (Exception e) {
                    log.info("解析文章质量分失败,文章:{}" , blogUrl);
                }

            }

            if(CollectionUtils.isEmpty(csdnBlogInfoList)) {
                log.info("解析文章质量分失败!");
            } else {
                log.info("此博主质量分如下:");
                log.info(new Gson().toJson(csdnBlogInfoList));
            }

        }
        driver.quit();
        log.info("读取数据完毕!the end!");
    }

    public static void main(String[] args) {
        CsdnQcService csdnQcService = new CsdnQcService();
        csdnQcService.allBlogQcDataBySelenium();
    }


}


总结

通过Java+Selenium查询某个博主的Top40文章质量分至此结束,优化空间还有很大,以实现效果为主。

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

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

相关文章

【瑞萨RA_FSP】WiFi——ESP8266模块通讯

文章目录 一、Wifi模块简介二、ESP8266功能介绍1. 通用输入/输出接口&#xff08;GPIO&#xff09;2. 使用UART与WIFI通讯3. ESP8266工作模式介绍 三、AT指令四、实验&#xff1a;STA模式测试1. 文件结构2. 宏定义函数3. ESP8266-STA功能函数4. 中断回调函数5. hal_entry入口函…

chatgpt赋能python:Python中的空值

Python中的空值 在Python编程中&#xff0c;空值指的是没有任何值的对象。在其他编程语言中&#xff0c;空值常常被称为null、nil、None或者undefined。Python中的空值用None关键字表示。 None 在Python语言中&#xff0c;None用于表示没有任何值。当用户要定义一个值却不想…

chatgpt赋能python:Python组合框(Combobox)介绍

Python组合框&#xff08;Combobox&#xff09;介绍 Python组合框&#xff08;Combobox&#xff09;是GUI编程中常用的一个组件&#xff0c;它可以让你在一个下拉框中选择一个或多个选项。Python组合框的特点是可以让用户自定义选项&#xff0c;也可以在选项中加入数据&#x…

红黑树-迭代器实现

目录 迭代器自增 当前结点存在右子树 当前结点没有存在右子树 迭代器自增完整代码 迭代器自减 迭代器自减代码&#xff1a; 迭代器自增 红黑树的迭代器应该怎么实现呢&#xff1f;现在我模仿大佬的实现逻辑。 我们迭代器最重要是可以允许自增与自减的实现的。 会发现我们…

chatgpt赋能python:Python程序运行速度问题

Python程序运行速度问题 Python是一种高级语言&#xff0c;其语法简洁、易于学习&#xff0c;在科学计算、数据分析、web开发等领域有着广泛的应用。然而&#xff0c;Python程序在运行速度方面却存在一定的瓶颈&#xff0c;这也是许多开发者关注的问题。本文将从多个方面探讨影…

【深度学习笔记】二分类问题与 Logistic 回归

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。刚兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; https://m…

chatgpt赋能python:Python等待一秒:介绍和用法全解析

Python等待一秒&#xff1a;介绍和用法全解析 什么是Python等待一秒&#xff1f; 在编写Python脚本时&#xff0c;我们通常要让程序暂停一段时间&#xff0c;这可以通过让程序等待一定的时间来实现。等待时间可以是任意长度的时间&#xff0c;最常见的时间单位是秒。Python中…

chatgpt赋能python:三种常见的Python程序错误及解决方案

三种常见的Python程序错误及解决方案 Python是一种高级编程语言&#xff0c;具有易读、易学、易维护等特点&#xff0c;被广泛应用于Web开发、数据分析、人工智能等领域。但是&#xff0c;即使是有10年Python编程经验的工程师也难免会犯错误。这篇文章将介绍Python程序中的三种…

Unity3D:添加设备

Unity3D&#xff1a;添加设备 推荐&#xff1a;将NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a;NSDT简石数字孪生 添加设备 若要将新设备添加到设备模拟器&#xff0c;请创建设备定义和设备覆盖。 设备定义是 Unity 项目中扩展名的文本文件。它包含描述设备属性的 …

数据结构第六章 图 6.4 图的应用 错题整理

4.A A. 不是简单路径的话&#xff0c;有环&#xff0c;去环路径会更短 B. 适合的 弗洛伊德算法才不适合 C. 本来就是 D 2X2矩阵拓展到3X3矩阵 再扩大 若是子集 即加入新顶点后&#xff0c;最短路径都没有变&#xff0c;错 5.B 本题用弗洛伊德更合适 但这道题只需全部代入求最…

chatgpt赋能python:Python简单计算器代码

Python简单计算器代码 Python是一种高级的编程语言&#xff0c;被广泛用于开发各种类型的应用程序&#xff0c;包括计算器应用程序。在本文中&#xff0c;我们将介绍Python简单计算器代码的实现和用法。 Python简单计算器代码介绍 一个简单的计算器能够实现基本的算术运算&a…

回溯注意点:回溯时间复杂度的计算与剪枝操作

文章目录 回溯的时间复杂度计算示例1&#xff1a;77.组合示例2&#xff1a;216.组合总和Ⅲ示例3&#xff1a;17.电话号码字母组合关于剪枝对时间复杂度的影响 回溯的剪枝操作必要性及适用场景示例1&#xff1a;组合剪枝剪枝优化点&#xff1a; 示例2&#xff1a;组合剪枝剪枝优…

STL容器(持续更新中)

一、string类 1. 构造函数 常用的构造函数如下。 构造函数原型含义string()默认构造函数。创建一个默认string对象&#xff0c;长度为0string(const string &s)拷贝构造函数。用一个string对象初始化另一个string对象string(const char *s)用字符串常量构建string对象st…

Linux系统编程(vfork和fork)

文章目录 前言一、vfork讲解二、vfork使用三、exit和_exit1.exit和_exit对比2.在vfork中的使用 四、vfork和fork区别总结 前言 本篇文章讲解vfork和fork创建进程的区别。 一、vfork讲解 vfork 是一个在类Unix操作系统中的系统调用&#xff0c;它创建一个新进程&#xff0c;且…

欠拟合、过拟合、正则化、学习曲线

1.欠拟合、过拟合、正则化、学习曲线 1.1 欠拟合、过拟合 欠拟合&#xff1a;模型相对于要解决的问题来说太简单了&#xff0c;模型并没有拟合训练数据的状态 过拟合&#xff1a;模型相对于要解决的问题来说太复杂了&#xff0c;模型只能拟合训练数据的状态 下图来自&#x…

第41步 深度学习图像识别:Efficientnet建模(Tensorflow)

一、写在前面 &#xff08;1&#xff09;Efficientnet EfficientNet是Google在2019年提出的一种新的卷积神经网络架构&#xff0c;主要目标是提高模型的效率&#xff0c;即在保持或提高模型性能的同时&#xff0c;尽可能地降低模型的复杂性和计算需求。 EfficientNet的关键思…

【MySQL】表的内外连接

目录 一、内连接&#xff08;表1 inner join 表2 on&#xff09; 1、显示SMITH的名字和部门名称 二、外连接 1、左外连接&#xff08;表名1 left join 表名2 on&#xff09; 1.1查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出…

2022(一等奖)D775北部湾红树林生理结构参数对水位变化的响应特征研究

作品介绍 1 应用背景 红树林作为全球生产力最高的生态系统之一&#xff0c;是生长在热带、亚热带海湾的一种特殊的木本植物群落。它由于其独特的海陆过渡特性&#xff0c;在维持滨海生态稳定、促进海陆能量循环中起着重要作用。同时&#xff0c;红树林可以吸附温室气体&#x…

第十二章 EfficientNetv2网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

Python爬取数据并进行数据CRUD的Web可视化项目

项目内容简介 爬取网站https://book.douban.com/top250上面的Top250数据,然后将数据保存到Mysql数据库中,最后这些数据记录以Web的方式进行展示,并实现对这些数据记录的CRUD(增删改查)! 项目实现简介 对豆瓣网站的爬虫的实现。 见项目中的爬取豆瓣Top250脚本(beautifulSoup).…