小奋斗 - 轻松学习从此开始!
IT小奋斗群 QQ群:62017228

Java小工具 根据URL的抓取搜索引擎搜索结果数目

效果如下图:

这里写图片描述

至此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)