本文共 8551 字,大约阅读时间需要 28 分钟。
上JD进行搜索java 复制链接https://search.jd.com/Search?keyword=java&enc=utf-8
F12进行查看书籍在那个div下
每本书下个信息
导入jsoup依赖
org.jsoup jsoup 1.13.1 com.alibaba fastjson 1.2.75
创建utils包并建立HtmlParseUtil.java爬取测试
//测试数据public static void main(String[] args) throws IOException, InterruptedException { //获取请求 String url = "https://search.jd.com/Search?keyword=java"; // 解析网页 (Jsou返回的Document就是浏览器的Docuement对象) Document document = Jsoup.parse(new URL(url), 30000); //获取id,所有在js里面使用的方法在这里都可以使用 Element element = document.getElementById("J_goodsList"); //获取所有的li元素 Elements elements = element.getElementsByTag("li"); //用来计数 int c = 0; //获取元素中的内容 ,这里的el就是每一个li标签 for (Element el : elements) { c++; //这里有一点要注意,直接attr使用src是爬不出来的,因为京东使用了img懒加载 String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img"); //获取商品的价格,并且只获取第一个text文本内容 String price = el.getElementsByClass("p-price").eq(0).text(); String title = el.getElementsByClass("p-name").eq(0).text(); String shopName = el.getElementsByClass("p-shop").eq(0).text(); System.out.println("========================================"); System.out.println(img); System.out.println(price); System.out.println(title); System.out.println(shopName); } System.out.println(c);}
测试结果
创建pojo实体类
Content.javaimport lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class Content { private String title; private String img; private String price; //可以自行添加属性}
封装工具类
HtmlParseUtils.java
@Componentpublic class HtmlParseUtil { // public static void main(String[] args) throws IOException { // new HtmlParseUtil().parseJD("Java").forEach(System.out::println);// } public ListparseJD(String keywords) throws IOException { //获取请求 https://search.jd.com/Search?keyword=java&enc=utf-8 //前提需要连网 String url = "https://search.jd.com/Search?keyword=" + keywords + "&enc=utf-8"; //解析网页 (Jsoup返回Document就是浏览器Document对象) Document document = Jsoup.parse(new URL(url), 30000); //所有在js中能使用的方法,这里都能用 Element element = document.getElementById("J_goodsList"); //获取所有li元素 Elements elements = element.getElementsByTag("li"); ArrayList goodList = new ArrayList<>(); //通过元素中的内容,这里el就是每一个li标签了 for (Element el : elements) { //加if判断是为了 过滤空标签 if (el.attr("class").equalsIgnoreCase("gl-item")) { //关于这种图片特别多的网页,所有的图片都是延迟加载的 //在jd搜索后f12可以看到存放在data-lazy-img中 String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img"); String price = el.getElementsByClass("p-price").eq(0).text(); String title = el.getElementsByClass("p-name").eq(0).text(); Content content = new Content(); content.setImg(img); content.setPrice(price); content.setTitle(title); goodList.add(content); } } return goodList; }}
编写业务层代码,去掉接口
ContentService.java
首先完成一个方法让爬取的数据存入ES中
//业务编写@Servicepublic class ContentService { //将客户端注入 @Autowired @Qualifier("restHighLevelClient") private RestHighLevelClient client; //1、解析数据放到 es 中 public boolean parseContent(String keyword) throws IOException { Listcontents = new HtmlParseUtil().parseJD(keyword); //把查询的数据放入 es 中 BulkRequest request = new BulkRequest(); request.timeout("2m"); for (int i = 0; i < contents.size(); i++) { request.add( new IndexRequest("jd_goods") .source(JSON.toJSONString(contents.get(i)), XContentType.JSON)); } BulkResponse bulk = client.bulk(request, RequestOptions.DEFAULT); return !bulk.hasFailures(); }}
在Controller包下建立
ContentController.java
//请求编写@RestControllerpublic class ContentController { @Autowired private ContentService contentService; @GetMapping("/parse/{keyword}") public Boolean parse(@PathVariable("keyword") String keyword) throws IOException { return contentService.parseContent(keyword); }}
启动Springboot项目,访问是否能将数据爬取至ES
//2、获取这些数据实现基本的搜索功能public List
在ContentController.java中添加搜索请求,使用RestFul
@GetMapping("/search/{keyword}/{pageNo}/{pageSize}")public List> search(@PathVariable("keyword") String keyword, @PathVariable("pageNo") int pageNo, @PathVariable("pageSize") int pageSize) throws IOException { List > list = contentService.searchPage(keyword, pageNo, pageSize); return list;}
访问访问http://localhost:9090/search/java/1/20 (查询Java 并从第一条显示到第二十条)
首先导入准备好的资源 并把axios,jquery,vue的js包导入
用vue接受数据
然后为按钮绑定点击事件与搜索绑定
修改ContentService.java中的搜索功能
//3、获取这些数据实现基本的搜索高亮功能public List> searchPagehighlighter(String keyword, int pageNo, int pageSize) throws IOException { if (pageNo <= 1) { pageNo = 1; } if (pageSize <= 1) { pageSize = 1; } //条件搜索 SearchRequest searchRequest = new SearchRequest("jd_goods"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //分页 sourceBuilder.from(pageNo).size(pageSize); //精准匹配 TermQueryBuilder termQuery = QueryBuilders.termQuery("title", keyword); //==================================== 高 亮 ========================================== HighlightBuilder highlightBuilder = new HighlightBuilder(); //获取高亮构造器 highlightBuilder.field("title"); //需要高亮的字段 highlightBuilder.requireFieldMatch(false);//不需要多个字段高亮 highlightBuilder.preTags(" "); //前缀 highlightBuilder.postTags(""); //后缀 sourceBuilder.highlighter(highlightBuilder); //把高亮构造器放入sourceBuilder中 sourceBuilder.query(termQuery); sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); //执行搜索 SearchRequest source = searchRequest.source(sourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); //解析结果 List > list = new ArrayList<>(); for (SearchHit hit : searchResponse.getHits().getHits()) { Map highlightFields = hit.getHighlightFields();//获取高亮字段 HighlightField title = highlightFields.get("title"); //得到我们需要高亮的字段 Map sourceAsMap = hit.getSourceAsMap();//原来的返回的结果 //解析高亮的字段 if (title != null) { Text[] fragments = title.fragments(); String new_title = ""; for (Text text : fragments) { new_title += text; } sourceAsMap.put("title", new_title); //高亮字段替换掉原来的内容即可 } list.add(sourceAsMap); } return list;}
改变Controller中的搜索请求后进行尝试
@GetMapping("/search/{keyword}/{pageNo}/{pageSize}")public List> search(@PathVariable("keyword") String keyword, @PathVariable("pageNo") int pageNo, @PathVariable("pageSize") int pageSize) throws IOException { List > list = contentService.searchPagehighlighter(keyword, pageNo, pageSize); return list;}
访问尝试
ok完成
转载地址:http://bzkaz.baihongyu.com/