ElasticSearch(五)SpringBoot+ES+Jsoup实现JD(京东)搜索

这篇具有很好参考价值的文章主要介绍了ElasticSearch(五)SpringBoot+ES+Jsoup实现JD(京东)搜索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

标题SpringBoot+ES+Jsoup实现JD搜索


项目效果
ElasticSearch(五)SpringBoot+ES+Jsoup实现JD(京东)搜索

1、功能概述

​ 利用Jsoup爬虫爬取JD商城的商品信息,并将商品信息存储在ElasticSearch中,同时利用请求进行全文检索,同时完成高亮显示等功能。

2、工具简介

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

httpclient:HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

3、操作步骤

3.1 创建SpringBoot项目

ElasticSearch(五)SpringBoot+ES+Jsoup实现JD(京东)搜索

3.2 勾选对应的集成包

ElasticSearch(五)SpringBoot+ES+Jsoup实现JD(京东)搜索

3.3 导入项目中需要的jar包依赖(这里需要注意springboot版本与ES版本的冲突问题)

​ 版本对应:

Spring Data Release Train Spring Data Elasticsearch Elasticsearch Spring Framework Spring Boot
2021.2 (Raj) 4.4.x 7.17.4 5.3.x 2.7.x
2021.1 (Q) 4.3.x 7.15.2 5.3.x 2.6.x
2021.0 (Pascal) 4.2.x[1] 7.12.0 5.3.x 2.5.x
2020.0 (Ockham)[1] 4.1.x[1] 7.9.3 5.3.2 2.4.x
Neumann[1] 4.0.x[1] 7.6.2 5.2.12 2.3.x
Moore[1] 3.2.x[1] 6.8.12 5.2.12 2.2.x
Lovelace[1] 3.1.x[1] 6.2.2 5.1.19 2.1.x
Kay[1] 3.0.x[1] 5.5.0 5.0.13 2.0.x
Ingalls[1] 2.1.x[1] 2.4.0 4.3.25 1.5.x

​ 需要导入maven依赖:

<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>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>

<!--解析网页 jsoup  解析视频 tika-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.6</version>
</dependency>

<!-- HttpClient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
	

3.4 编写ES客户端配置类 ElasticSearchClientConfig (用于spring整体管理)

@Configuration
public class ElasticSearchClientConfig {
  @Bean
  public RestHighLevelClient restHighLevelClient(){
    RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
      RestClient.builder(
        new HttpHost("127.0.0.1", 9200)));
    return restHighLevelClient;
  }
}

3.5 编写爬虫工具类 HtmlParseUtil

//html解析工具类
public class HtmlParseUtil {
  public static void main(String[] args) throws IOException {

    List<Content> list = HtmlParseUtil.parseJDSearchKeyByPage("洗衣机", 2);
    System.out.println(list.size());

  }

  public static List<Content> parseJDSearchKeyByPage(String key,int page) throws IOException {
    List<Content> list = new ArrayList<>();
    for (int i = 1; i <=page ; i++) {
      List<Content> itemList = HtmlParseUtil.parseJDSearchKey(key, i);
      list.addAll(itemList);
    }
    return list;
  }

  public static List<Content> parseJDSearchKey(String key,int page) throws IOException {
    //拼接URL路径和请求参数
    String url = UrlBuilder.create()
      .setScheme("https")
      .setHost("search.jd.com")
      .addPath("Search")
      .addQuery("keyword", key)
      .addQuery("enc","utf-8")
      .addQuery("page",String.valueOf(2*page-1)) //默认爬取前两页数据
      .build();

    URL url1 = new URL(url);
    HttpURLConnection httpConn = (HttpURLConnection) url1.openConnection();
    httpConn.setRequestMethod("GET");
/**
利用http模仿浏览器行为,防止被京东反爬虫程序
**/
    httpConn.setRequestProperty("authority", "search.jd.com");
    httpConn.setRequestProperty("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
    httpConn.setRequestProperty("accept-language", "zh-CN,zh;q=0.9");
    httpConn.setRequestProperty("cache-control", "max-age=0");
    httpConn.setRequestProperty("cookie", "__jdv=122270672|direct|-|none|-|1657610731752; __jdu=1657610731752947367087; pinId=zrLGvhk9izSm009P6x9LOw; pin=apple_ggUEIRS; unick=apple_ggUEIRS; ceshi3.com=000; _tp=70MDtYz0RbaKAAA4iyM%2FQQ%3D%3D; _pst=apple_ggUEIRS; shshshfpb=daS4RVr0Yk9w65Hio31lN-g; shshshfpa=03fd05de-1795-e1be-7faa-dbe1342ebbcd-1657504705; rkv=1.0; areaId=12; ipLoc-djd=12-988-0-0; TrackID=1xjK9942JTH1cA13hCy9lpjoF4VUsywFztnHXMZa8fMqdod6dnvsJBqV2ZD7UVJXPOj_9eOcIbRSs8MdtE1dIc4M7Ie1oRPm-h1ZW-hdOnb9Gtb_DRX3_JGb_ZkJexJcQ; qrsc=3; PCSYCityID=CN_320000_320500_0; user-key=93bcac49-c4f4-4018-8b25-0766e0c16eda; cn=0; shshshfp=fc6aabe0109953d6062026a77f8bb1e5; __jda=122270672.1657610731752947367087.1657610732.1657610732.1657610732.1; __jdb=122270672.12.1657610731752947367087|1.1657610732; __jdc=122270672; shshshsID=fcfca37eb1dce4e7ebabf041ed253e70_6_1657612610164; thor=D83906BED82DBCAAD56166802034A7EB66575CF409BC09A49AFAF3487B79FEB995355C1A9063238C46E44EDF6CFED6A8324081B64A2FC4E00045BBAB6836FB7D4A6F24F6FBF97FE1F6A3014B93F3032242CB6FE9BF9D997B81005B34FA33DC1505BFB42E7DA2FE2D5991823CAEC187EE28A13F59C3698528BFD659FBAB4CFF16650B12DA4813475B5BF6F26CFCF2C198; 3AB9D23F7A4B3C9B=4YK7NHSJLWRZZ3CXJ4A22DRHHX7TAZBRBGGHDONJODT3TACJJJ65IS72HOSU4LFNHG6ZV3WAFDYORHCEBRJYYI6ZL4");
    httpConn.setRequestProperty("sec-ch-ua", "\".Not/A)Brand\";v=\"99\", \"Google Chrome\";v=\"103\", \"Chromium\";v=\"103\"");
    httpConn.setRequestProperty("sec-ch-ua-mobile", "?0");
    httpConn.setRequestProperty("sec-ch-ua-platform", "\"macOS\"");
    httpConn.setRequestProperty("sec-fetch-dest", "document");
    httpConn.setRequestProperty("sec-fetch-mode", "navigate");
    httpConn.setRequestProperty("sec-fetch-site", "none");
    httpConn.setRequestProperty("sec-fetch-user", "?1");
    httpConn.setRequestProperty("upgrade-insecure-requests", "1");
    httpConn.setRequestProperty("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36");

    InputStream responseStream = httpConn.getResponseCode() / 100 == 2
      ? httpConn.getInputStream()
      : httpConn.getErrorStream();
    Scanner s = new Scanner(responseStream).useDelimiter("\\A");
    String response = s.hasNext() ? s.next() : "";
    Document document = Jsoup.parse(response);
    //        Document document = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36").cookie("wlfstk_smdl","4jxg7p5cy2jz7afp41rull7hc3y9mkjr").timeout(30000).get();
    Element j_goodsList = document.getElementById("J_goodsList");
    if(j_goodsList==null)
      return  new ArrayList<>(); ;

    Element gl_warp= j_goodsList.getElementsByClass("gl-warp").get(0);

    ArrayList<Content> contents = new ArrayList<>();
    for (Element child : gl_warp.children()) {
      //img图片路径是存放在懒加载路径里面。
      String img =child.getElementsByTag("img").eq(0).attr("data-lazy-img");
      String price = child.getElementsByClass("p-price").eq(0).text();
      String name = child.getElementsByClass("p-name").eq(0).text();
      Content content = new Content();
      content.setImg(img);
      content.setTitle(name);
      content.setPrice(price);
      contents.add(content);
    }
    return contents;
  }
}

3.6 编写前端页面 index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

  <head>
    <meta charset="utf-8"/>
    <title>ES仿京东实战</title>
    <link rel="stylesheet" th:href="@{/css/style.css}"/>

  </head>

  <body class="pg">
    <div class="page" id="app">
      <div id="mallPage" class=" mallist tmall- page-not-market ">

        <!-- 头部搜索 -->
        <div id="header" class=" header-list-app">
          <div class="headerLayout">
            <div class="headerCon ">
              <!-- Logo-->
              <h1 id="mallLogo">
                <img th:src="@{/images/jdlogo.png}" alt="">
              </h1>

              <div class="header-extra">

                <!--搜索-->
                <div id="mallSearch" class="mall-search">
                  <form name="searchTop" class="mallSearch-form clearfix">
                    <fieldset>
                      <legend>天猫搜索</legend>
                      <div class="mallSearch-input clearfix">
                        <div class="s-combobox" id="s-combobox-685">
                          <div class="s-combobox-input-wrap">
                            <input v-model="keyword" type="text" autocomplete="off" value="dd" id="mq"
                                   class="s-combobox-input" aria-haspopup="true"
                                   >
                          </div>
                        </div>
                        <button type="submit" id="searchbtn"   @click.prevent="searchKey">搜索</button>
                      </div>
                    </fieldset>
                  </form>
                  <ul class="relKeyTop">
                    <li><a>Java</a></li>
                    <li><a>前端</a></li>
                    <li><a>Linux</a></li>
                    <li><a>大数据</a></li>
                    <li><a>理财</a></li>
                  </ul>
                </div>
              </div>
            </div>
          </div>
        </div>

        <!-- 商品详情页面 -->
        <div id="content">
          <div class="main">
            <!-- 品牌分类 -->
            <form class="navAttrsForm">
              <div class="attrs j_NavAttrs" style="display:block">
                <div class="brandAttr j_nav_brand">
                  <div class="j_Brand attr">
                    <div class="attrKey">
                      品牌
                    </div>
                    <div class="attrValues">
                      <ul class="av-collapse row-2">
                        <li><a href="#">  </a></li>
                        <li><a href="#"> Java </a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </form>

            <!-- 排序规则 -->
            <div class="filter clearfix">
              <a class="fSort fSort-cur">综合<i class="f-ico-arrow-d"></i></a>
              <a class="fSort">人气<i class="f-ico-arrow-d"></i></a>
              <a class="fSort">新品<i class="f-ico-arrow-d"></i></a>
              <a class="fSort">销量<i class="f-ico-arrow-d"></i></a>
              <a class="fSort">价格<i class="f-ico-triangle-mt"></i><i class="f-ico-triangle-mb"></i></a>
            </div>

            <!-- 商品详情 -->
            <div class="view grid-nosku">

              <!--                    <div class="product">-->
              <!--                        <div class="product-iWrap">-->
              <!--                            &lt;!&ndash;商品封面&ndash;&gt;-->
              <!--                            <div class="productImg-wrap">-->
              <!--                                <a class="productImg">-->
              <!--                                    <img src="https://img.alicdn.com/bao/uploaded/i1/3899981502/O1CN01q1uVx21MxxSZs8TVn_!!0-item_pic.jpg">-->
              <!--                                </a>-->
              <!--                            </div>-->
              <!--                            &lt;!&ndash;价格&ndash;&gt;-->
              <!--                            <p class="productPrice">-->
              <!--                                <em><b>¥</b>2590.00</em>-->
              <!--                            </p>-->
              <!--                            &lt;!&ndash;标题&ndash;&gt;-->
              <!--                            <p class="productTitle">-->
              <!--                                <a> dkny秋季纯色a字蕾丝dd商场同款连衣裙 </a>-->
              <!--                            </p>-->
              <!--                            &lt;!&ndash; 店铺名 &ndash;&gt;-->
              <!--                            <div class="productShop">-->
              <!--                                <span>店铺: Java </span>-->
              <!--                            </div>-->
              <!--                            &lt;!&ndash; 成交信息 &ndash;&gt;-->
              <!--                            <p class="productStatus">-->
              <!--                                <span>月成交<em>999笔</em></span>-->
              <!--                                <span>评价 <a>3</a></span>-->
              <!--                            </p>-->
              <!--                        </div>-->
              <!--                    </div>-->

              <div class="product" v-for="(item,index) in result" :key="index+item">
                <div class="product-iWrap">
                  <!--商品封面-->
                  <div class="productImg-wrap">
                    <a class="productImg">
                      <img :src="'http:'+item.img">
                    </a>
                  </div>
                  <!--价格-->
                  <p class="productPrice">
                    <!--                                <em><b>¥</b>2590.00</em>-->
                    <em>{{item.price}}</em>
                  </p>
                  <!--标题-->
                  <p class="productTitle">
                    <a v-html="item.title">  </a>
                    <!--                                <a> {{item.title}}} </a>-->
                  </p>
                  <!-- 店铺名 -->
                  <div class="productShop">
                    <span>店铺: Java </span>
                  </div>
                  <!-- 成交信息 -->
                  <p class="productStatus">
                    <span>月成交<em>999笔</em></span>
                    <span>评价 <a>3</a></span>
                  </p>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <script th:src="@{/js/jquery.min.js}"></script>
    <script th:src="@{/js/axios.min.js}"></script>
    <script th:src="@{/js/vue.min.js}"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          keyword:"",
          result:[]
        },
        methods:{
          async searchKey(){
            let keyword = this.keyword;
            console.log(keyword);

            let res =  await axios.post("ES/Search",{
              keyword,
              pageSize:20,
              pageNo:1
            })
            console.log(res);
            if(res!=null&& res!=undefined){
              // alert("查询成功")
              this.result = res.data;
            }
          }
        }
      })

    </script>
  </body>
</html>

3.7 创建商品pojo类 Content

@Data
public class Content {
    private String img;
    private String title;
    private String price;
}

3.8 编写爬虫同步逻辑代码

/** Controller层代码  **/
@Slf4j
@RestController
@RequestMapping("/ES")
public class ESController {
    @Resource
    EsDataSearchService esDataSearchService;

    /**
     * 导入数据进入es
     * @param keyword
     * @return
     * @throws Exception
     */
    @GetMapping("/data/{keyword}")
    public boolean  SynchronizeData(@PathVariable("keyword") String keyword) throws Exception {
        return esDataSearchService.SynchronizeData(keyword);
    }
}

/** Service层代码 **/
@Service
public class EsDataSearchServiceImpl implements EsDataSearchService {

  @Resource
  RestHighLevelClient restHighLevelClient;

  @Override
  public boolean SynchronizeData(String keyword)throws Exception {
    List<Content> contents = HtmlParseUtil.parseJDSearchKeyByPage(keyword,2) ;
    //创建批量操作请求
    BulkRequest jd_goods = new BulkRequest();
    jd_goods.timeout("2m");

    //将爬取出来的数组同步进入es
    for (Content content : contents) {
     //新增添加请求
      jd_goods.add(
        new IndexRequest("jd_goods")
        .source(JSON.toJSONString(content), XContentType.JSON)
      );
    }
    //批量请求
    BulkResponse response = restHighLevelClient.bulk(jd_goods, RequestOptions.DEFAULT);
    return !response.hasFailures();
  }
}

注意:通过将爬取的数据转成数组,再通过es批量处理,将数据同步进入es

3.9 编写查询接口

/** Controller层代码  **/
@PostMapping("/Search")
public List<Content> SearchData(@RequestBody SearchObject searchObject)  {
  return esDataSearchService.SearchData(searchObject,true);
}


/** Service层代码 **/
@SneakyThrows
@Override
public List<Content> SearchData(SearchObject searchObject,boolean flag) {
  SearchRequest request = new SearchRequest();
  request.indices("jd_goods");
  SearchSourceBuilder builder = new SearchSourceBuilder();

  //分页
  builder.from((searchObject.getPageNo()-1)*searchObject.getPageSize());
  builder.size(searchObject.getPageSize());

  HighlightBuilder highlightBuilder = new HighlightBuilder();
  //多个高亮显示
  highlightBuilder.requireFieldMatch(false);
  highlightBuilder.preTags("<span style='color:red;'>");
  highlightBuilder.postTags("</span>");
  highlightBuilder.field("title");

  builder.highlighter(highlightBuilder);
  //精准匹配 必须完全相同 否则无法展示
  TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", searchObject.getKeyword());
  MatchPhraseQueryBuilder queryBuilders = QueryBuilders.matchPhraseQuery("title", searchObject.getKeyword());
  builder.query(queryBuilders);

  //带中文的匹配
  BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  //boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("title",searchObject.getKeyword()));
  builder.query(boolQueryBuilder);
  builder.timeout(new TimeValue(60, TimeUnit.SECONDS));

  request.source(builder);

  //执行搜索
  SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);

  //获取结果
  List<Content> res = new ArrayList<>();
  SearchHits hits = response.getHits();
  for (SearchHit hit : hits.getHits()) {
    Content content = JSON.parseObject(hit.getSourceAsString(), Content.class);
    Map<String, HighlightField> highlightFields = hit.getHighlightFields();
    HighlightField title = highlightFields.get("title");
    if(title!=null){
      Text[] fragments = title.fragments();
      StringBuffer str = new StringBuffer("");//利用StringBuffer拼接效率更高
      for (Text fragment : fragments) {
        str.append(fragment);
      }
      content.setTitle(str.toString());
    }


    res.add( content);
  }

  //没有就现插入
  if(res.size()==0&&flag){
    //第一次没有查找到数据,则进行一次数据爬取再执行查询。
    this.SynchronizeData(searchObject.getKeyword());
    Thread.sleep(1000);//线程睡眠1s 因为同步es数据是异步操作,等待同步完成。
    res =  this.SearchData(searchObject,false);
  }
  return res;

}

3.10 启动项目,通过 启动端口进行访问(记得打开ES服务)

ES项目视频

4、总结

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。

它可以做实时数据存储,es检索数据本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。文章来源地址https://www.toymoban.com/news/detail-425327.html

到了这里,关于ElasticSearch(五)SpringBoot+ES+Jsoup实现JD(京东)搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 京东API接口解析,实现获得JD商品评论

    要获取京东商品评论,需要使用京东的开放平台API接口。以下是一个基本的示例,解析并实现获取JD商品评论的API接口。 首先,你需要访问京东开放平台并注册一个开发者账号。注册完成后,你需要创建一个应用并获取到API的权限。 在获取到API权限后,你可以在开发者的控制

    2024年02月10日
    浏览(39)
  • Java SpringBoot API 实现ES(Elasticsearch)搜索引擎的一系列操作(超详细)(模拟数据库操作)

    小编使用的是elasticsearch-7.3.2 基础说明: 启动:进入elasticsearch-7.3.2/bin目录,双击elasticsearch.bat进行启动,当出现一下界面说明,启动成功。也可以访问http://localhost:9200/ 启动ES管理:进入elasticsearch-head-master文件夹,然后进入cmd命令界面,输入npm run start 即可启动。访问http

    2024年02月04日
    浏览(57)
  • ElasticSearch系列 - SpringBoot整合ES之全文搜索匹配查询 match

    官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html 权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/structured-search.html 1. 数据准备 官方测试数据下载地址:https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip ,数据量很大,我们自己构造数据吧。 2. m

    2023年04月08日
    浏览(52)
  • 搜索引擎ElasticSearch分布式搜索和分析引擎学习,SpringBoot整合ES个人心得

    Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,

    2024年02月04日
    浏览(72)
  • ElasticSearch系列 - SpringBoot整合ES:指定搜索结果返回的字段_source

    Elasticsearch的搜索结果可以通过以下参数进行控制: from:指定搜索结果的起始位置,默认为0。 size:指定返回的文档数量,默认为10。 sort:指定搜索结果的排序方式,可以按照字段升序或降序排列。 query:指定搜索的查询条件,可以使用各种查询语句进行搜索。 filter:指定

    2024年02月04日
    浏览(52)
  • Elasticsearch ES实现GEO位置搜索

    ES实现GEO位置搜索 Elasticsearch-7.15.2 附近查询,也叫做距离查询(geo_distance):查询到指定中心点小于某个距离值的所有文档。 创建索引 (my_geo),直接设置mapping GEO字段的创建:添加一个字段location,类型为 geo_point。 GEO类型的字段是不能使用动态映射自动生成的,我们需要在创

    2024年01月16日
    浏览(45)
  • 121.【ElasticSearch伪京东搜索】

    (1).启动EslaticSearch (9200) (2).启动Es-head (9101) (3).启动 Kibana (5602) 数据库获取。 消息队列中获取中。 爬虫 tika包解析电影的.jsoup解析网页 (1).实体类 (2).工具类编写 (已废弃⭐) (3).工具类编写 - 解决京东防护 ContentService.java 切记我们只能读取到我们ES中存放的数据,假如进行查询没有

    2024年02月12日
    浏览(34)
  • Java网络爬虫——jsoup快速上手,爬取京东数据。同时解决‘京东安全’防爬问题

    网络爬虫,就是在 浏览器上,代替人类爬取数据 ,Java网络爬虫就是通过Java编写爬虫代码,代替人类从网络上爬取信息数据。程序员通过设定既定的规则,让程序代替我们从网络上获取海量我们需要的数据,比如图片,企业信息等。 爬虫的关键是对于网页信息的解析。 什么

    2024年02月10日
    浏览(44)
  • ES es Elasticsearch 十三 Java api 实现搜索 分页查询 复杂查询 过滤查询 ids查询 等

    目录 Java api 实现搜索 Pom.xml 建立链接 搜索全部记录 增加规则值查某些字段 搜索分页 全代码 Ids 搜索 搜索Match搜索 multi_match 搜索 多字段搜索 复杂查询 bool查询 filter  bool 复杂查询增加过滤器查询 复杂擦好像加排序 日志 思路 参考 api 写法 写Java代码 请求条件构建层次

    2024年02月04日
    浏览(60)
  • elasticsearch[五]:深入探索ES搜索引擎的自动补全与拼写纠错:如何实现高效智能的搜索体验

    前一章讲了搜索中的拼写纠错功能,里面一个很重要的概念就是莱文斯坦距离。这章会讲解搜索中提升用户体验的另一项功能 - [自动补全]。本章直接介绍 ES 中的实现方式以及真正的搜索引擎对自动补全功能的优化。 大家对上面的这个应该都不陌生,搜索引擎会根据你输入的

    2024年01月24日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包