Yahoo! 検索

概要

サンプルプログラム

このサンプルプログラムでは簡単のために正規表現を使ってレスポンスを処理していますが、 DOM を使ってもよいでしょう。

import java.io.*;
import java.net.*;
import java.util.Scanner;
import java.util.regex.*;

// usage: java YahooSearcher word [site_url]
//        java YahooSearcher アキバ系 d.hatena.ne.jp

class YahooSearcher {
    // 登録済のアプリケーションID
    private static final String appid = "*******************";
    public static void main(String args[]) {
	YahooSearchRequest request = new YahooSearchRequest();
	String query = args[0];
	request.setQuery(query);
	if(args.length > 1)
	    request.setSite(args[1]);
	request.setAppID(appid);
	request.run();
    }
}

class YahooSearchRequest {
    // response の文字セット
    private String responseEncoding = "utf-8";
    // URL の文字セット
    private String urlEncoding = "utf-8";
    // Request URL
    private String searchURL = "http://search.yahooapis.jp/WebSearchService/V2/webSearch";
    // *** 以下は検索パラメータ
    //     see http://developer.yahoo.co.jp/webapi/search/websearch/v2/websearch.html
    private String param_appid;
    // キーワード
    private String param_query;
    // 一回に表示する件数
    private String param_results;
    private String param_format;
    private String param_site;

    public YahooSearchRequest() {
	// 検索パラメータの初期化
	param_appid = "dummy";
	param_query = "";
	param_results = "10";
	param_format = "any";
	param_site = "";
    }

    public void setQuery(String query) {
	try {
	    // URLエンコードをしてASCII文字に
	    // ex. "東京 大学" -> %93%8C%8B%9E+%93%64%91%E5
	    param_query = URLEncoder.encode(query, urlEncoding);
	}
	catch(UnsupportedEncodingException e) {
	    System.err.println("Unsupported Encoding.");
	}
    }

    public void setSite(String site) {
	try {
	    param_site = URLEncoder.encode(site, urlEncoding);
	}
	catch(UnsupportedEncodingException e) {
	    System.err.println("Unsupported Encoding.");
	}
    }

    public void setAppID(String appid) {
	param_appid = appid;
    }

    public void run() {
	String requestURL = searchURL +
	    "?appid=" + param_appid +
	    "&query=" + param_query +
	    "&site=" + param_site +
	    "&format=" + param_format +
	    "&results=" + param_results;
	Response response = new Response();
	response.setURL(requestURL);
	response.setEncoding(responseEncoding);
	response.run();
    }
}

class Response {
    // response のURL
    private String urlString;
    // RSS response の文字セット
    private String encoding;

    public Response() {
	urlString = null;
	encoding = "utf-8";
    }

    public void setURL(String url) {
	this.urlString = url;
    }

    public void setEncoding(String encoding) {
	this.encoding = encoding;
    }

    public void run() {
	System.out.println("アクセス先URL: " + urlString); // 確認
	Scanner scanner = null;

        try {
	    URL url = new URL(urlString);
	    URLConnection urlConnection = url.openConnection();
	    urlConnection.connect();
	    scanner = new Scanner(urlConnection.getInputStream(), encoding);
        }
        catch (IOException e) {
            System.err.println("Cannot connect: " + urlString);
            System.exit(1);
        }

	// 各要素の内容抽出のためのパターン (Response用)
	Pattern patternTitle = Pattern.compile("<Title>(.+?)</Title>", Pattern.DOTALL);
	Pattern patternLink = Pattern.compile("<Url>(.+?)</Url>", Pattern.DOTALL);
	Pattern patternDescription = Pattern.compile("<Summary>(.+?)</Summary>", Pattern.DOTALL);

	scanner.useDelimiter("<Result>");	// Result要素の開始タグを区切りとする
	int i = 0;
	while(scanner.hasNext()) {
	    String resultContent = scanner.next();
	    if(i == 0) { // 0個目は最初の<Result>よりも前なので不要
		i++;
		continue;
	    }
	    System.out.println("Result #" + i + ":");
	    System.out.println("文字列: " + resultContent); // 確認
	    System.out.println();
	    String title = "";
	    String link = "";
	    String description = "";
	    Matcher matcher;
	    // タイトルの抽出
	    matcher = patternTitle.matcher(resultContent);
	    if(matcher.find())
		title = matcher.group(1);
	    // リンクの抽出
	    matcher = patternLink.matcher(resultContent);
	    if(matcher.find())
		link = matcher.group(1);
	    // 要約の抽出
	    matcher = patternDescription.matcher(resultContent);
	    if(matcher.find())
		description = matcher.group(1);
	    // 表示
	    System.out.println("  タイトル: " + title);
	    System.out.println("  リンク: " + link);
	    System.out.println("  要約: " + description);
	    System.out.println();
	    i++;
	}
    }
}

YahooSearcher.java (utf-8-unix)

YahooSearcher.java (shift_jis-dos)