[[FrontPage]]

2009/07/30 からのアクセス回数 &counter;

#contents

** アクセスログ解析 [#m77c65e1]
自分のブログページに対し、どのようなことを知りたいと思ってアクセスしてきて
いるのかを調べるために、
apacheのアクセスログの内、Googleの検索経由でアクセスされたものを抽出します。

*** アクセスログのフィールド切り [#ma171ef7]
アクセスログから、
- アクセス時刻
- アクセスページのURL
- Googleの検索文字列

を取り出すことにします。

この解析は面倒だと思っていたら、以下のURLで正規表現を使って簡単に切り出せることが分かりました。
http://www.groovy-number.com/java/sample/AccessLog.html

切り出した、フォールドからブログのタイトルと検索文字列を取り出します。
- ブログはPukiWikiを使っているので、必ずindex.phpがGETコマンドに入っている
- Googleの検索文字列は、q=の後に続く

ことを考慮して、以下のように処理しました。

#pre{{
			PrintWriter writer = new PrintWriter(new OutputStreamWriter(System.out));
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(INPUT_FILE)));	
			Pattern pattern = Pattern.compile(".+ .+ .+ \\[(.+) \\+0900\\] \"([^\"]+)\" .+ .+ \"([^\"]+)\" \"[^\"]+\"");
			String 		line = null;
			while ((line = reader.readLine()) != null) {
				Matcher matcher = pattern.matcher(line);
				if (matcher.matches()) {
						String time = matcher.group(1);
						String url = URLDecoder.decode(matcher.group(2), "UTF-8");
						String google = matcher.group(3);
						String query=null;
						StringTokenizer token = new StringTokenizer(google, "?&");
						while (token.hasMoreTokens()) {
							String str = token.nextToken();
							if (str.indexOf("q=") == 0) {
								query = URLDecoder.decode(str, "UTF-8");
								query = query.replaceFirst("q=", "");
							}
						}
						url = url.replaceFirst("GET .*\\/index.php\\?", "");
						url = url.replaceFirst(" HTTP\\/1..", "");
						url = url.replaceFirst("plugin=smartdoc&page=", "");
						
						writer.printf("%s,", time);
						writer.printf("\"%s\",", url);
						if (query != null)
							writer.printf("\"%s\"", query);
						writer.println();
				
				}
				else {
					System.out.println("解析できない行がありました:" + line);
				}
			}
			reader.close();
			writer.close();
}}


** コメント [#ndc7f3ba]
この記事は、

#vote(おもしろかった,そうでもない,わかりずらい)

皆様のご意見、ご希望をお待ちしております。

#comment_kcaptcha


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc