Hatena::Groupdaichan330

趣味には偏ってないだいちゃんの日記 このページをアンテナに追加 RSSフィード

2009-01-09

てきとーにJavaでハイククライアント(特定キーワードに対するページ単位のエントリ算出)

| 20:13 |  てきとーにJavaでハイククライアント(特定キーワードに対するページ単位のエントリ算出) - 趣味には偏ってないだいちゃんの日記 を含むブックマーク はてなブックマーク -  てきとーにJavaでハイククライアント(特定キーワードに対するページ単位のエントリ算出) - 趣味には偏ってないだいちゃんの日記  てきとーにJavaでハイククライアント(特定キーワードに対するページ単位のエントリ算出) - 趣味には偏ってないだいちゃんの日記 のブックマークコメント

所要?というほどでもないですが、3時間程度で特定のキーワードに対するページ単位でのユーザ投稿エントリを算出するJavaハイククライアントを作ってみました。かなり適当です。簡単に動作だけ。

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


public class GetHaikuEntryFromKeywordPage {
	private static String TARGET = "http://h.hatena.ne.jp/api/statuses/keyword_timeline/";
	private static String FILE_NAME = "entry_result.txt";
	private static String keyword = "ひとりごと";

	private static int PAGE_READ_RETRY_COUNT = 1;
	private static int PAGE_COUNT_MAX = 1000;

	private int page_count = 1;

	private boolean replied_flag = false;
	private boolean user_flag = false;
	private BigInteger current_id = null;
	
	private Map<String, Integer> entryMap = new HashMap();
	
	public void execute() throws IOException {
		int error_page_count = 0;
		int succeeded_page_count = 0;
		BufferedReader reader = null;

		while (page_count <= PAGE_COUNT_MAX) {
			try {
				String encKeyword = URLEncoder.encode(keyword, "UTF-8");
				String target = 
					TARGET + encKeyword + ".xml" + "?page=" + page_count ;
				URL url = new URL(target);

				System.out.println("Page[" + page_count + "] is reading...");
				
				HttpURLConnection conn = (HttpURLConnection)url.openConnection();
				conn.setRequestMethod("GET");
				conn.setDoOutput(true);
			
				reader = new BufferedReader(
							new InputStreamReader(
									conn.getInputStream()));
				String readLine;
				while ((readLine = reader.readLine()) != null) {
					easyParse(readLine);
				}
				reader.close();

				/* アクセス成功 */
				System.out.println("Page[" + page_count + "] read success!!");
				succeeded_page_count++;
				page_count++;
				error_page_count = 0;
			} catch (Exception e) {
				//e.printStackTrace();
				System.out.println("Page[" + page_count + "] read error!! [ErrorCount=" + (error_page_count+1) + "]");
				error_page_count++;
				if (reader != null) {
					try {
						reader.close();
					} catch (Exception ex) {
						ex.printStackTrace();
					}
				}
				/* エラーの回数が規定を超えたら仕方ないので次ページへ */
				if (error_page_count == PAGE_READ_RETRY_COUNT) {
					System.out.println("Page[" + page_count + "] read Miss... Next page is reading.");
					page_count++;
					error_page_count = 0;
				}
			}
		}
		printUserEntry();

		System.out.println("-----------------------------");
		System.out.println("[RESULT]");
		System.out.println("Total Read Page:" + PAGE_COUNT_MAX);
		System.out.println("Succeeded Read Page:" + succeeded_page_count);
		System.out.println("Failed Read Page:" + error_page_count);
		System.out.println("Total UserID:" + entryMap.size());
		System.out.println("-----------------------------");
	}

	private void printUserEntry() {
		List<Entry<String, Integer>> entries = 
			new ArrayList<Entry<String, Integer>>(entryMap.entrySet());
		Collections.sort(entries, 
				new Comparator<Entry<String, Integer>>() {

			public int compare(Entry<String, Integer> o1, 
					Entry<String, Integer> o2) {
				int result = o2.getValue().compareTo(o1.getValue());
				if (result != 0) {
					return result;
				}
				return o1.getKey().compareTo(o2.getKey());
			}
		});
		System.out.println("Result is writing...");
		writeUserEntry(entries);
		System.out.println("Result writed.");
	}

	private void writeUserEntry(List<Entry<String, Integer>> entries) {
		PrintWriter writer = null;
		try {
			writer = new PrintWriter(new FileWriter(FILE_NAME));
			Iterator<Entry<String, Integer>> iterator = entries.iterator();
			while (iterator.hasNext()) {
				Entry<String, Integer> entry = iterator.next();
				writer.println(entry.getKey() + ": " + entry.getValue());
			}
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
			if (writer != null) {
				writer.close();
			}
		}
	}

	/* 簡易パーザ */
	private void easyParse(String readLine) {
		// nameタグにユーザ名が入っている
		if (readLine.indexOf("<name>") != -1 &&
				readLine.indexOf("</name>") != -1 &&
				!replied_flag) {
			String username = 
				readLine.substring(12, readLine.length() - 7);
			if (!entryMap.containsKey(username)) {
				entryMap.put(username,new Integer(1));
			}
			else {
				Integer entry_count = entryMap.get(username);
				Integer new_entry_count = 
					new Integer(entry_count.intValue() + 1);
				entryMap.put(username, new_entry_count);
			}
		}
		
		// replies タグ内は読み飛ばし対象
		else if (readLine.indexOf("<replies>") != -1) {
			replied_flag = true;
		}
		else if (readLine.indexOf("</replies>") != -1) {
			replied_flag = false;
		}

		// user タグ内はid記録対象外
		else if (readLine.indexOf("<user>") != -1) {
			user_flag = true;
		}
		else if (readLine.indexOf("</user>") != -1) {
			user_flag = false;
		}
	}
}

LesErexLesErex2019/02/17 17:45Lasix Pay Online American Express <a href=http://mpphr.com>priligy canada where to buy</a> Vente De Viagra Quebec Compra Cialis En Espana Free Cialis

LesErexLesErex2019/03/03 15:31Where Do I Buy Cialis Viagra Sin Prescripcion Por Venta <a href=http://cialcost.com>cialis 20mg price at walmart</a> Propecia Itch Order From Phone Amoxicillin Buy Levothyroxine 100mcg Online Generic