文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java应用开源框架实现简易web搜索引擎

2023-05-30 20:03

关注

引言

应用 Java 的开源库,编写一个搜索引擎,这个引擎能爬取一个网站的内容。并根据网页内容进行深度爬取,获取所有相关的网页地址和内容,用户可以通过关键词,搜索所有相关的网址。

具体功能

(1) 用户可以指定爬取一个url对应的网页的内容。
(2) 对网页内容进行解析,并获取其中所有的url链接地址。
(3) 用户可以设定爬取深度,代表着从初始url对应的页面开始,可以爬取其中所有的url对应的网页内的url,以此类推。深度越大,能爬取到的网站越多。
(4) 对爬取到的url内容进行保存、建立索引。建立索引的内容是url地址本身,和url对应的网页标题。
(5) 用户可以通过关键词对网址进行搜索,找出有该关键词的url地址。
(6) 建立索引和搜索索引的过程能智能识别中文关键词,能对关键词进行分词操作。
(7) 用户可以指定保存索引的地址、初始url、爬取深度、进行搜索的关键词和最大匹配项。

开源框架

  1. Lucene
  2. Jsoup

源码

爬虫部分:Spider.java

package webCrawler.Spider;import java.io.IOException;import java.util.ArrayList;import java.util.HashSet;import java.util.Scanner;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import webCrawler.Index.BuildIndex;public class Spider {  ArrayList<String> URLs;  private String startURL;  private int digLevel;    public Spider(String startURL, int digLevel){    this.startURL = startURL;    this.digLevel = digLevel;    this.URLs = new ArrayList<>();  }    public ArrayList<String> getLevelURLs(int level, ArrayList<String> arrayList)       throws IOException{    ArrayList<String> total = null;    if(level>0){            total = new ArrayList<>();      for(String url: arrayList){                for(String each: getBareLinks(url)){          total.add(each);        }      }            HashSet<String> hashSet = new HashSet<>(total);      total = new ArrayList<>(hashSet);    }    return total;  }    public void getAll() throws IOException{    ArrayList<String> newURLs;    ArrayList<String> currentURLs = new ArrayList<>();        currentURLs.add(startURL);    for(int i=digLevel; i>0; i--){            System.out.println("Dig into level: " + (digLevel-i+1));      newURLs = getLevelURLs(i, currentURLs);      for(String each: currentURLs){        URLs.add(each);      }      currentURLs = newURLs;    }    for(String each:currentURLs){      URLs.add(each);    }    HashSet<String> hashSet = new HashSet<>(URLs);    URLs = new ArrayList<>(hashSet);  }    public void storeURLsAndInfo(String path) throws IOException{    BuildIndex build = new BuildIndex(path);        for(String each:URLs){      String text = getLinkText(each);      if(text!=null){        build.addField("url", each);        build.addField("text", text);                build.pushIndex();      }    }    build.close();  }    public String getLinkText(String url) throws IOException{    Document document = null;    try {            document = Jsoup.connect(url).timeout(3000).get();    } catch (Exception e) {      System.out.println("[TIMEOUT]Get title of url:"+url);      return null;    }    String title = document.title();    return title;  }    public ArrayList<String> getBareLinks(String url) throws IOException{    ArrayList<String> linksList = new ArrayList<>();    Document document;    try {      document = Jsoup.connect(url).timeout(2000).get();    } catch (Exception e) {      return linksList;    }        Elements links = document.select("body").select("a[href]");    for(Element link: links){            String href = link.attr("abs:href").replaceAll("#", "");            if(href.contains("zju.edu.cn")){        if (href.endsWith("/")){          href = href.substring(0, href.length()-1);        }        linksList.add(href);      }    }    HashSet<String> hashSet = new HashSet<>(linksList);    ArrayList<String> arrayList = new ArrayList<>(hashSet);    return arrayList;  }  public static void main(String[] args) {    Scanner in = new Scanner(System.in);    System.out.println("Enter url:");    String url = in.nextLine().trim();    while(!url.startsWith("http://")){      System.out.println("http:// is needed!");      System.out.println("Enter url:");      url = in.nextLine().trim();    }    System.out.println("Enter depth to dig more urls[<=3 recommended]:");    int depth = in.nextInt();    Spider spider = new Spider(url, depth);    System.out.println("Enter path you want to save[default=d:/index-spider]:");    String path = in.nextLine().trim();    if(path.length()==0){      path = "d:/index-spider";    }    try {      System.out.println("Start fetching...");      spider.getAll();      System.out.println("Urls got success!");      spider.storeURLsAndInfo(path);      System.out.println("Stored success!");    } catch (IOException e) {      e.printStackTrace();    }  } }

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯