效果如下图:
至此Google、百度以及搜狗三大搜索引擎,可根据需要扩展其他搜索引擎。
下面是类图:
通过抽象类SearchEngine实现代码的可扩展性。
下面SearchEngine抽象类的源码:
--------------------------------------------------------------------------------------------------------------------------------------
package com.eyck; import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import javax.swing.JOptionPane; public abstract class SearchEngine { //由解析网页源码,由子类实现 public abstract void parse(String key); //进行URL编码,由子类实现 public abstract String UrlEncoder(String key); //搜索不到相关内容 public void showErrorMessage(String key){ String show = "找不到和您查询的\""+key+"\"相符的内容或信息。\n" + "建议:\n" + "* 请检查输入字词有无错误。\n" + "* 请尝试其他查询词。\n" + "* 请改用较常见的字词。"; System.out.println(show); JOptionPane.showMessageDialog(null, show); } //获取网页源码 public String search(String url){ BufferedReader br = null; StringBuilder sb ; String result = null; // FileWriter fw = null; // File file = null; try{ sb = new StringBuilder(); System.out.println(url); URL mUrl = new URL(url); System.setProperty("http.agent", "Chrome");//支持Google搜索 URLConnection conn = mUrl.openConnection(); String hasRead = ""; // file = new File("G:\\javapractice\\Baidu\\google.html"); // fw = new FileWriter(file); br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8")); while((hasRead=br.readLine())!=null){ sb.append(hasRead); // fw.write(hasRead); } result = sb.toString(); }catch(Exception e){ e.printStackTrace(); }finally{ try { br.close(); // fw.close(); } catch (IOException e) { e.printStackTrace(); } return result; } } }
--------------------------------------------------------------------------------------------------------------------------------------
实现类BaiduSearch源码:
package com.eyck; import java.net.URLEncoder; import javax.swing.JOptionPane; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; public class BaiduSearch extends SearchEngine{ @Override public void parse(String key) { // TODO Auto-generated method stub String url = UrlEncoder(key); String result = search(url); int start = -1; int end = -1; Document doc = Jsoup.parse(result); Elements elements = doc.getElementsByClass("nums"); String element = elements.toString(); System.out.println(element); for(int i=0;i<element.length();i++){ if(element.charAt(i)=='百'){ start = i; } if(element.charAt(i)=='个'){ end = i+1; } } String finalResult = element.substring(start, end); if(!finalResult.equals("0")){ System.out.println(finalResult); JOptionPane.showMessageDialog(null, finalResult); }else{ showErrorMessage(key); } } @Override public String UrlEncoder(String key) { String url = "http://www.baidu.com/s?wd="; return url += URLEncoder.encode(key); } }
--------------------------------------------------------------------------------------------------------------------------------------
其他两个实现类GoogleSearch.java和SougouSearch.java与BaiduSearch.java差不多,根据返回的具体源码进行解析即可,这里就不放上来了。
接下来是SearchClient的源码:
package com.eyck; import java.applet.Applet; import java.awt.Button; import java.awt.Choice; import java.awt.Color; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.util.ListIterator; import javax.swing.JOptionPane; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class SearchClient extends Applet implements ActionListener{ TextField keyword = new TextField(30); Choice engine ; Button go = new Button("搜索"); SearchEngine mEngine; public void init(){ setBackground(Color.white); keyword = new TextField(20); engine = new Choice(); engine.addItem("百度"); engine.addItem("Google"); engine.addItem("搜狗"); engine.select(1); add(keyword); add(engine); add(go); addKeyListener(new MyKeyListener()); go.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource() == go){ try{ String key = goSearch(); mEngine.parse(key); }catch(Exception ex){ ex.printStackTrace(); } } } private String goSearch() throws Exception{ // TODO Auto-generated method stub String str = keyword.getText(); if(str.equals("")){ JOptionPane.showMessageDialog(null, "请填写搜索的关键词"); return null; } String engineName = ""; switch(engine.getSelectedIndex()){ case 0: engineName = "http://www.baidu.com/"; mEngine = new BaiduSearch(); break; case 1: engineName = "https://www.google.com.hk/"; mEngine = new GoogleSearch(); break; case 2: engineName = "https://www.sogou.com/"; mEngine = new SougouSearch(); break; } //url += URLEncoder.encode(str); showStatus("正在等待"+engineName+"的响应"); return str; } }
--------------------------------------------------------------------------------------------------------------------------------------
这里在解析网页源码的时候使用jsoup开源框架 对HTML 文档进行解析和操作,需要导入相关的jar包,笔者使用的是jsoup-1.10.1.jar。
UML类图使用startUML绘制。
小奋斗文章
--------------------------------------------------------------------------------------------------------------------------------------
我来评几句
已发表评论数(0)