【Selenium+Webmagic】基于JAVA语言实现爬取js渲染后的页面,附有代码

事先声明
笔者最近需要查看一些数据,自己挨个找太麻烦了,于是简单的学了一下爬虫。笔者在这里声明,爬的数据只为学术用,没有其他用途,希望来这篇文章学习的同学能抱有同样的目的。

枪本身不坏,坏的是使用枪的人

效果
在这里插入图片描述

基于JAVA语言实现爬取js渲染后的页面,详细教程

  • 下载ChromeDriver
    • 下载ChromeDrive以及相对应的Chrome
    • 禁止Chrome自动升级
      • 第一步:禁用任务计划
      • 第二步:禁用更新服务
      • 第三步:重命名更新程序
  • 使用IDEA实现爬取js渲染后的页面
    • 所需依赖
    • 修改maven的镜像地址
    • 具体实现
      • 建议
      • WebMagic
      • 一个简单的demo
      • 实现思路
      • 使用Selenium解析js渲染后的页面信息
      • 重写自定义pageProcessor的process方法
      • 项目代码

下载ChromeDriver

查看自己的Chrome版本,过高需要卸载再下载
在地址栏键入

chrome://version/

查看版本
在这里插入图片描述

下载ChromeDrive以及相对应的Chrome

ChromeDriver的版本需要仔细考究,一个ChromeDriver版本对应一个Chrome版本,由于Chrome版本更新太快,最近已经到119.xx了,ChromeDriver最高支持版本才115.xx, 因此我们要先把本地的Chrome卸载,然后下载相应的历史版本
Chrome历史版本1
Chrome历史版本2 版本更多更全面
ChromeDriver历史版本

笔者以114为例子
在这里插入图片描述
点击后会进入下载页,里面有windows版本以及note.txt,在txt文件中会写有支持哪个Chrome版本
在这里插入图片描述
在这里插入图片描述
我上面给出的Chrome历史版本1中没有114版本,在历史版本2中有,可以自行去下载

禁止Chrome自动升级

由于Chrome更新太快,ChromeDriver跟不上,并且Chrome总是自动升级,这里给出禁止Chrome自动升级的解决办法1

第一步:禁用任务计划

首先是【右键计算机->管理】,在【计算机管理(本地)->系统工具->任务计划程序->任务计划程序库】中找到两个和Google自动更新相关的任务计划【GoogleUpdateTaskMachineCore】与【GoogleUpdateTaskMachineUA】,并把它俩禁用掉。
在这里插入图片描述

第二步:禁用更新服务

然后在下方的【服务和应用程序->服务】中,找到两个和Google更新相关的服务【Google更新服务(gupdate)】、【Google更新服务(gupdatem)】,并右键,选择属性,把启动类型改为禁用。如果没有找到的可以略过。
在这里插入图片描述

第三步:重命名更新程序

完成上面两步后理论上就可以停止Chrome的自动更新了,不过有网友说这么做之后,不要在Chrome中点击【帮助->关于Google Chrome】
这里笔者尝试过,确实有这种情况,为了避免,我们可以修改他的update.exe的名字:
笔者给出自己电脑上update的地址:(没有修改Chrome默认安装地址)

C:\Program Files (x86)\Google\Update

修改这个名字,如果你在这个位置没有找到,可以参考资料1的位置
在这里插入图片描述
到这里就结束了,在地址栏键入

chrome://version/

查看当前版本

不过笔者没有再尝试在Chrome中点击【帮助->关于Google Chrome】是否会更新,大胆的小伙伴可以试试

使用IDEA实现爬取js渲染后的页面

相应的版本

SpringBoot 2.6.13
Webmagic: 0.8.0
Selenium-java 3.141.59

现在SpringInitializer已经不支持SpringBoot2.x了,你可以升级使用SpringBoot3,再使用下面代码或者参考我另一篇文章使用SpringBoot2:Spring Initializer 已经不支持Java8,也就是SpringBoot2.x项目初始化

所需依赖

下面依赖有些你可能不需要 比如thymeleaf,不过都加上也不会报错

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.3.2</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>3.3.2</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>3.5.1</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-extension --><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions><version>0.8.0</version></dependency><!-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.3-jre</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--模拟浏览器行为--><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId></dependency></dependencies>

修改maven的镜像地址

下载semenium的依赖需要的时间会比较长,而且下载webmagic依赖的时候有些包在阿里云Central镜像下找不到, 需要修改为all
打开配置文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改完保存即可

具体实现

建议

再看下面代码之前,还是要有一定的webmagic基础的,推荐BiliBili上一个教程,只需要两个多小时就能理解webmagic的工作流程Java爬虫案例实战-webmagic(第二话) 2021最新

WebMagic

WebMagic中文文档

从图中可以看到Spider是爬虫启动的关键入口。

我们要做的就是自定义一个xxPageProcessor,实现PageProcessor接口,重写两个方法
Site, process
在process方法中将抓取到的url地址添加到scheduler队列中,图中一个request其实是一个url地址,并不是http的请求;
其中resultItems保存的是向pipeline中写入的数据,是一个linkedhash结构

pipeline是输出的关键,可以向控制台中输出,也可以自定义一个pipeline,向数据库中写入信息

Scheduler默认是内存队列,可以修改为redis队列(成本高)

Download我这里没有自定义,不过官网给出了自定义的方法,感兴趣的可以看看

一个简单的demo

/*** @Author:sichenyong* @Email: sichenyongwork@163.com* @Package:com.scy* @Project:crawer* @Date:2023/12/2 19:45* @description:使用css选择器解析*/
@Slf4j
public class MyPageProcessor2 implements PageProcessor {public void process(Page page) {Html html = page.getHtml();String title = html.css("title", "text").get();log.info("title is {}", title);page.putField("title", title);String s = html.css("a", "href").get();// 向resultItems中写入数据page.putField("a", s);List<String> all = html.css("a", "href").all();page.putField("allLinks", all);page.putField("html",html);}public Site getSite() {return Site.me();}public static void main(String[] args) {MyPageProcessor2 myPageProcessor2 = new MyPageProcessor2();Spider.create(myPageProcessor2).addUrl("https://www.stats.gov.cn/sj/sjjd/202311/t20231115_1944598.html").start();}
}

实现思路

在这里插入图片描述
相较于webmagic的架构,我们只需要在process方法中使用selenium的解析方法获取js加载后的数据就可以

使用Selenium解析js渲染后的页面信息

  1. 首先定义初始化chromedriver的函数

    private String devicePath = "D:\\SoftWare\\environemnt\\chromeDriver\\chromedriver.exe";
    private ChromeDriver webDriver;void setUp(){System.getProperties().setProperty("webdriver.chrome.driver",devicePath);ChromeOptions options = new ChromeOptions();options.addArguments("--headless");webDriver = new ChromeDriver(options);webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    }
    
  2. 实现解析函数

    /*** @description:解析js加载后的页面,获取相关信息* @author: sichenyong* @email: sichenyongwork@163.com* @date: 2023/12/4 16:43* @param: [page]* @return: com.example.entity.UsefulMessage**/UsefulMessage parseJS(Page page) {UsefulMessage usefulMessage = new UsefulMessage();String url = page.getUrl().get();webDriver.get(url);// 获取所有的a标签地址List<WebElement> aElements = webDriver.findElements(By.cssSelector("div.list-content > ul > li > a.fl.mhide.pc1200"));if (aElements.size() > 0) {List<String> hrefValue = new ArrayList<>();for (WebElement aElement : aElements) {hrefValue.add(aElement.getAttribute("href"));}// 设置列表地址usefulMessage.setHrefs(hrefValue);// 设置是否是列表页usefulMessage.setListPage(true);// 获取下一页的地址WebElement element = webDriver.findElement(By.cssSelector("body > div > div.wrapper-content > div > div.wrapper-list-right > div.list-pager.mhide > a.next"));String nextUrl = element.getAttribute("href");//设置下一页的url地址usefulMessage.setNextPageUrl(nextUrl);log.info("===下一页地址===" + nextUrl);String column = webDriver.findElement(By.cssSelector("body > div > div.wrapper-content > div > div.wrapper-list-left.mhide > div > ul > li.active")).getText();// 设置栏目usefulMessage.setColumn(column);}webDriver.quit();return usefulMessage;}
    
  3. 完整代码

    /**
    * @Author:sichenyong
    * @Email: sichenyongwork@163.com
    * @Package:com.example.component
    * @Project:selenium
    * @Date:2023/12/3 22:02
    * @description:使用selenium解析js加载之后的页面信息
    * @Version:1.0 由于笔者没有学过设计模式,因此写的代码有些冗余,见谅。
    */
    @Slf4j
    public class SeleniumProcessor {//下载的ChromeDriver地址private String devicePath = "D:\\SoftWare\\environemnt\\chromeDriver\\chromedriver.exe";private ChromeDriver webDriver;void setUp(){System.getProperties().setProperty("webdriver.chrome.driver",devicePath);ChromeOptions options = new ChromeOptions();options.addArguments("--headless");webDriver = new ChromeDriver(options);webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);}/*** @description:解析js加载后的页面,获取相关信息* @author: sichenyong* @email: sichenyongwork@163.com* @date: 2023/12/4 16:43* @param: [page]* @return: com.example.entity.UsefulMessage**/UsefulMessage parseJS(Page page) {// 自定义的实体类,保存自己向要的js生成的信息UsefulMessage usefulMessage = new UsefulMessage();String url = page.getUrl().get();webDriver.get(url);// 获取所有的a标签地址List<WebElement> aElements = webDriver.findElements(By.cssSelector("div.list-content > ul > li > a.fl.mhide.pc1200"));if (aElements.size() > 0) {List<String> hrefValue = new ArrayList<>();for (WebElement aElement : aElements) {hrefValue.add(aElement.getAttribute("href"));}// 设置列表地址usefulMessage.setHrefs(hrefValue);// 设置是否是列表页usefulMessage.setListPage(true);// 获取下一页的地址WebElement element = webDriver.findElement(By.cssSelector("body > div > div.wrapper-content > div > div.wrapper-list-right > div.list-pager.mhide > a.next"));String nextUrl = element.getAttribute("href");//设置下一页的url地址usefulMessage.setNextPageUrl(nextUrl);log.info("===下一页地址===" + nextUrl);String column = webDriver.findElement(By.cssSelector("body > div > div.wrapper-content > div > div.wrapper-list-left.mhide > div > ul > li.active")).getText();// 设置栏目usefulMessage.setColumn(column);}webDriver.quit();return usefulMessage;}/*** @description: 解析网页的数据*              parse可以根据需要进行修改,爬取你想要的* @author: sichenyong* @email: sichenyongwork@163.com* @date: 2023/12/4 14:20* @param: [page, filterTitle]* @return: void**/void parse(Page page, String filterTitle, String column) {try {// 获取urlString url = page.getUrl().get();webDriver.get(url);// 获取标题String title = webDriver.findElement(By.cssSelector("body > div > div.wrapper-content > div > div.detail-title > h1")).getText();if (title.contains(filterTitle)) {// 创建数据库实体Stats stats = new Stats();// 读入当前页的urlstats.setPubUrl(url);// 读入titlestats.setWebTitle(title);// 读入栏目stats.setPubColumn(column);// 获取数据来源WebElement source = webDriver.findElement(By.cssSelector("body > div > div.wrapper-content > div > div.detail-title > div > h2:nth-child(1) > span"));String pubSources = source.getText();String regex = ":";if (pubSources.contains(":")) {regex = ":";}String[] strings = pubSources.split(regex);String pubSource = strings[strings.length-1];stats.setPubSource(pubSource);// 获取发布时间String pubTime = webDriver.findElement(By.cssSelector("body > div > div.wrapper-content > div > div.detail-title > div > h2:nth-child(1) > p")).getText();pubTime = pubTime.replaceAll("/","-");stats.setPubTime(pubTime);// 存入数据库page.putField("stats",stats);}else {log.error("文章\"" + title + "\"中不包含关键字:{}", filterTitle);page.getResultItems().setSkip(true);}} catch (Exception e) {e.printStackTrace();}finally {webDriver.quit();}}/*** @description: 需要过滤的数据有多个* @author: sichenyong* @email: sichenyongwork@163.com* @date: 2023/12/4 14:21* @param: [page, filterTitles]* @return: void**/void parse(Page page, List<String> filterTitles,String column) {try {// 获取urlString url = page.getUrl().get();webDriver.get(url);// 获取标题String title = webDriver.findElement(By.cssSelector("body > div > div.wrapper-content > div > div.detail-title > h1")).getText();if (support(title, filterTitles)) {// 创建数据库实体Stats stats = new Stats();// 读入当前页的urlstats.setPubUrl(url);// 读入titlestats.setWebTitle(title);// 读入栏目stats.setPubColumn(column);// 获取数据来源WebElement source = webDriver.findElement(By.cssSelector("body > div > div.wrapper-content > div > div.detail-title > div > h2:nth-child(1) > span"));String pubSources = source.getText();String regex = ":";if (pubSources.contains(":")) {regex = ":";}String[] strings = pubSources.split(regex);String pubSource = strings[strings.length-1];stats.setPubSource(pubSource);// 获取发布时间String pubTime = webDriver.findElement(By.cssSelector("body > div > div.wrapper-content > div > div.detail-title > div > h2:nth-child(1) > p")).getText();pubTime = pubTime.replaceAll("/","-");stats.setPubTime(pubTime);// 存入数据库page.putField("stats",stats);}else {log.error("文章\"" + title + "\"中不包含关键字:{}", filterTitles);page.getResultItems().setSkip(true);}} catch (Exception e) {e.printStackTrace();}finally {webDriver.quit();}}/*** @description:判断title是否在想要的列表中* @author: sichenyong* @email: sichenyongwork@163.com* @date: 2023/12/4 14:28* @param: [title, filterTitles]* @return: boolean**/boolean support(String title, @NotNull List<String> filterTitles) {for (String filterTitle : filterTitles) {if (title.contains(filterTitle)) {return true;}}return false;}
    }

重写自定义pageProcessor的process方法

/*** @Author:sichenyong* @Email: sichenyongwork@163.com* @Package:com.scy.component* @Project:stats* @Date:2023/12/3 13:25* @description:*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@Slf4j
public class StatsPageProcessor implements PageProcessor {/*** @description: 过滤标题文章,保存含有filterTitle的文章* demo: filterTitle = "Java"*          函数会自动保存所有含有Java的文章,将不含有java的文章过滤掉* @author: sichenyong* @email: sichenyongwork@163.com* @date: 2023/12/3 14:03**/protected String filterTitle="";protected List<String> filterTitles;private String column;@Overridepublic void process(Page page) {SeleniumProcessor seleniumProcessor1 = new SeleniumProcessor();seleniumProcessor1.setUp();// 获取解析js后的网页信息UsefulMessage usefulMessage = seleniumProcessor1.parseJS(page);// 是列表页if (usefulMessage.isListPage()) {// 获取所有的链接List<String> links = usefulMessage.getHrefs();// 传给Schedulerpage.addTargetRequests(links);// 解析下一页String nextPage = usefulMessage.getNextPageUrl();page.addTargetRequest(nextPage);column = usefulMessage.getColumn();// 列表页面的数据不写入数据库page.getResultItems().setSkip(true);}else {// 详情页面写入数据库
//            parseStats(page);SeleniumProcessor seleniumProcessor = new SeleniumProcessor();seleniumProcessor.setUp();if (filterTitles == null) {seleniumProcessor.parse(page, filterTitle, column);}else {seleniumProcessor.parse(page, filterTitles, column);}}}/*** @description: 解析详情页面 - 无法解析js加载的页面* @Deprecated* @param: page* @return: void* @author: sichenyong* @email: sichenyongwork@163.com* @date: 2023/12/3 14:04**/@Deprecatedprivate void parseStats(Page page) {Html html = page.getHtml();// 获取页面的标题String title = html.css("body > div > div.wrapper-content > div > div.detail-title > h1","text").get();// 如果文章中包含filterTitle,则保存文章if (title.contains(filterTitle)) {Stats stats = new Stats();//获取当前页面的urlString currentUrl = page.getUrl().get();// 获取当前页面的pubtimeString pubTime = html.css("body > div > div.wrapper-content > div > div.detail-title > div > h2:nth-child(1) > p", "text").get();// 获取页面的来源String pubSources = html.xpath("/html/body/div/div[3]/div/div[1]/div/h2[1]/span/text()").get();String regex = ":";if (pubSources.contains(":")) {regex = ":";}String[] strings = pubSources.split(regex);String pubSource = strings[strings.length-1];stats.setWebTitle(title);stats.setPubUrl(currentUrl);stats.setPubSource(pubSource);stats.setPubTime(pubTime);// 写入数据库page.putField("stats",stats);}}@Overridepublic Site getSite() {Site site = new Site();// 设置重试间隔时间site.setRetryTimes(3);site.setRetrySleepTime(3000);site.setSleepTime(3000);return site;}
}

项目代码

有时间再上传


  1. 三步彻底关闭chrome谷歌浏览
    器自动更新; ↩︎ ↩︎

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

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

相关文章

Naco安装、配置、使用request接口交互

1. Docker安装Naco 官方文档https://nacos.io/zh-cn/docs/quick-start-docker.html&#xff0c;然而自己部署的时候遇到了“Database not set”的问题。有可能是因为环境中已经部署了3306的mysql服务导致的。&#xff08;虽然我尝试修改了naco的docker-compose&#xff0c;但是…

如何制作教育培训小程序

教育培训行业近年来发展迅速&#xff0c;越来越多的机构开始意识到通过小程序来提供在线教育服务的重要性。小程序不仅可以为用户提供便捷的学习体验&#xff0c;还可以增加机构的知名度和品牌影响力。那么&#xff0c;如何制作一款教育培训小程序呢&#xff1f; 首先&#xff…

WT2605C语音芯片:实现蓝牙音频播放与BLE透传,引领智能设备应用新潮流

随着蓝牙技术的快速发展&#xff0c;蓝牙音频播放和BLE&#xff08;蓝牙低功耗&#xff09;透传已成为智能设备中不可或缺的功能。在这样的背景下&#xff0c;WT2605C语音芯片以其出色的性能和集成度&#xff0c;完美实现了蓝牙音频播放BLE透传的功能&#xff0c;为智能设备的应…

【例1.6】回文数(Noip1999)

1309&#xff1a;【例1.6】回文数(Noip1999) 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 若一个数&#xff08;首位不为零&#xff09;从左向右读与从右向左读都是一样&#xff0c;我们就将其称之为回文数。例如&#xff1a;给定一个 10进制数 56&#xff0c;将 56加…

using meta-SQL 使用元SQL 六

%Table Syntax %Table(recname) Description Use the %Table construct to return the SQL table name for the record specified with recname. 使用%Table构造返回使用recname指定的记录的SQL表名。 This construct can be used to specify temporary tables for runn…

sqlmap400报错问题解决

python sqlmap.py -r sql.txt --batch --techniqueB --tamperspace2comment --risk 3 --force-ssl–batch 选项全部默认 不用再手动输入 –techniqueB 使用布尔盲注&#xff0c;该参数是指出要求使用的注入方式 –tamperspace2comment使用特殊脚本&#xff0c;space2comment是把…

【MySQL语言汇总[DQL,DDL,DCL,DML]以及使用python连接数据库进行其他操作】

MySQL语言汇总[DQL,DDL,DCL,DML] SQL分类1.DDL:操作数据库&#xff0c;表创建 删除 查询 修改对数据库的操作对表的操作复制表&#xff08;重点&#xff09;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 2.DML:增删改表中数据3.DQL&#xff1a;查询表中的记录…

jsp在线辅助教育系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 在线辅助教育系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

工厂生产数据展示基本布局Demo(提供素材)

效果图&#xff1a; <template><div class"app-container"><a-row :span"24"><a-col :span"12"><div class"divBox"><div class"flexBoxs"><div style"margin: 2px 5px;"…

在windows server系统下,快速部署自己的网站

目录 xampp简介xampp的作用xampp的安装方法Apache简介Apache的作用 本文主要介绍使用xampp软件包在windows server系统下&#xff0c;快速部署自己的网站。 xampp简介 XAMPP是一款基于Apache、MySQL、PHP和Perl的开源Web服务器软件包。XAMPP支持多个操作系统&#xff0c;包括W…

go写文件后出现大量NUL字符问题记录

目录 背景 看看修改前 修改后 原因 背景 写文件完成后发现&#xff1a; size明显也和正常的不相等。 看看修改前 buf : make([]byte, 64) buffer : bytes.NewBuffer(buf)// ...其它逻辑使得buffer有值// 打开即将要写入的文件&#xff0c;不存在则创建 f, err : os.Open…

MySQL数据备份

一、逻辑备份 备份的是建表、建库、插入等操作所执行SQL语句&#xff0c;适用于中小型数据库&#xff0c;效率相对较低。 本质&#xff1a;导出的是SQL语句文件 优点&#xff1a;不论是什么存储引擎&#xff0c;都可以用mysqldump备成SQL语句 缺点&#xff1a;速度较慢&…

Mysql分布式集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上

1.1 目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1 数据分片 MySQL集群Cluster将数据分成多个片段&#xff0c;每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上&#xff0c;提高系统的性能和可扩展性。 2. 数据同步 MySQL集群Cluster使…

前端面试理论题

1.什么是js&#xff1f;js的特点是什么&#xff1f; js&#xff1a; 是一种直译式脚本语言&#xff0c;是一种动态类型、弱类型、基于原型的高级语言。 特点&#xff1a;简单性&#xff1b;安全性&#xff1b;动态性&#xff1b;跨平台性&#xff1b; 简单性&#xff1a;它的…

ElasticSearch之Close index API

关闭指定的索引。 索引关闭之后&#xff1a; 停止对读、写操作的响应。停止检索操作的响应。在索引关闭前&#xff0c;允许执行的操作&#xff0c;关闭之后均不允许执行。ElasticSearch取消对索引的相关维护操作&#xff0c;包含内存中的数据结构&#xff0c;以及保存在存储中…

c++--运算符重载

1.重载的运算符 (1).重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。 (2).除了重载的函数调用运算符operator()之外&#xff0c;其他重载运算符不能含有默认实参。 (3).对一个重载的运算符&#xff0c;其优先级和结合律与对应的内置运算符保持一致。 (4).当一个…

2022年全国大学生数据分析大赛医药电商销售数据分析求解全过程论文及程序

2022年全国大学生数据分析大赛 医药电商销售数据分析 原题再现&#xff1a; 问题背景   20 世纪 90 年代是电子数据交换时代&#xff0c;中国电子商务开始起步并初见雏形&#xff0c;随后 Web 技术爆炸式成长使电子商务处于蓬勃发展阶段&#xff0c;目前互联网信息碎片化以…

破解研发人员的绩效考核难题

当下的中国正处于产业结构调整的重要转型时期。创新成为当下企业寻求稳健和长远发展必不可少的关键。要建立属于自己的企业特色&#xff0c;开发出属于自己的产品和服务并在激励竞争的市场下求得生存和发展&#xff0c;企业的自主研发活动已经越来越重视。纵观那些世界500强企业…

【Centos】在CentOS上搭建Squid代理服务器详解

在CentOS上搭建Squid代理服务器详解 一、安装 首先&#xff0c;通过yum包管理工具安装Squid代理服务器和httpd-tools&#xff08;用于生成密码文件&#xff09;&#xff1a; yum install squid -y yum install httpd-tools -y二、生成密码文件 创建用于存储用户认证信息的目…

杨辉三角

打印n行杨辉三角&#xff0c;n<10。 输入格式: 直接输入一个小于10的正整数n。 输出格式: 输出n行杨辉三角&#xff0c;每个数据输出占4列。 输入样例: 5输出样例: 11 11 2 11 3 3 11 4 6 4 1代码长度限制 16 KB 时间限制 400 ms 内存限制 6…