import java.io.*;
import java.net.*;
import java.util.Scanner;
import java.util.regex.*;
// Yahoo! Auctions を検索
// DOM ではなく正規表現で情報を抜き出す
//
// usage: java YahooAuctionsSearcher word
class YahooAuctionsSearcher {
// 登録済のアプリケーションID
private static final String appid = "websearch05ki999";
public static void main(String args[]) {
YahooSearchRequest request = new YahooSearchRequest();
String query = args[0];
request.setQuery(query);
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://auctions.yahooapis.jp/AuctionWebService/V2/search";
// *** 以下は検索パラメータ
// see http://developer.yahoo.co.jp/webapi/auctions/auction/v2/search.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("<ItemListUrl>(.+?)</ItemListUrl>", Pattern.DOTALL);
Pattern patternPrice = Pattern.compile("<CurrentPrice>(.+?)</CurrentPrice>", Pattern.DOTALL);
scanner.useDelimiter("<Item>"); // item要素の開始タグを区切りとする
int i = 0;
System.out.println("<html><head><title>検索結果</title></head><body>");
while(scanner.hasNext()) {
String resultContent = scanner.next();
if(i == 0) { // 0個目は最初の<item>よりも前なので不要
i++;
continue;
}
System.out.println("<h2>" + i + "件目:</h2>");
// System.out.println("文字列: " + resultContent); // 確認
System.out.println();
String title = "";
String link = "";
String price = "";
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 = patternPrice.matcher(resultContent);
if(matcher.find())
price = matcher.group(1);
// 表示
System.out.println("<div>" + title + "</div>");
System.out.println("<div>" + price + "</div>");
System.out.println("<div>" + link + "</div>");
System.out.println();
i++;
}
System.out.println("</body></html>");
}
}
YahooAuctionsSearcher.java (utf-8-unix)
YahooAuctionsSearcher.java (shift_jis-dos)