読者です 読者をやめる 読者になる 読者になる

Javaでregexとか

やったこと

lolkingのchampionsのstatisticsの情報を抽出
正規表現とか
urlからhtmlを取ってくる
mysqljdbcとか少し

感想

なんかデータまとめて少し有意義なデータにしたいところ
こういうのって対応したサイトの構成が少し変わっただけで対応できなくなるんだけど、そんなもんなのだろうか

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import java.util.Calendar;

public class regex {
	//mysqlつかった
	//これでテーブル作成
	/*
	 	create table champ(
			name varchar(20),
			usegeRate double,
			winRate double,
			date date,
			unique(name,date)
		);
	 */
	static int year=Calendar.getInstance().get(Calendar.YEAR);
	static Connection conn = null;
	static String url = "jdbc:mysql://localhost/lol_statistics";
	static String user = "root";
	static String password = "";
	static Statement stmt = null;
	
	//lolkingのchampions statisticsから情報を抽出
	public static void main(String args[]) {
		try {
			// Class.forName("com.mysql.jdbc.Driver").newInstance(); //なくてもうまくいく
			// System.out.println("ドライバのロードに成功しました");
			
			conn = DriverManager.getConnection(url, user, password);
			stmt = conn.createStatement();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		System.out.println(new File(".").getAbsolutePath());
		File file=new File("html");
		if(!file.exists() || !file.isDirectory())file.mkdir();
		
		String input = fileHttpGet("http://www.lolking.net/champions/draven#statistics");
		
		setChampDB(input);
		
		champTableOutput();
	}
	
	static void setChampDB(String input){
		String name=getChampName(input);

		String reg = "\\['[0-9',. /]+\\]";
		Pattern p = Pattern.compile(reg);

		Matcher m = p.matcher(input);
		while (m.find()) {
			try {
				String str=m.group(),date=getDate(str),strs[]=str.split(" ");
				double num=Double.parseDouble(strs[1].substring(0, strs[1].length()-1));
				String sql;
				sql="select * from champ where name='"+name+"' and date='"+date+"'";
				ResultSet rs = stmt.executeQuery(sql);
				if(!rs.next()){
					sql = "insert into champ(name,date) values ('"+name+"','"+date+"')"; 
					stmt.executeUpdate(sql);
				}
				
				if(strs.length==2){
					sql="update champ set winRate="+num+" where name='"+name+"' and date='"+date+"'";
				}else if(strs.length==3){
					sql="update champ set usegeRate="+num+" where name='"+name+"' and date='"+date+"'";
				}
				stmt.executeUpdate(sql);
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	static String getDate(String input){
		return year+"-"+input.substring(2,4)+"-"+input.substring(5,7);
	}
	
	static String getChampName(String input){
		String reg="<title>.+</title>";
		Pattern p=Pattern.compile(reg);
		Matcher m=p.matcher(input);
		if(m.find()){
			String str=m.group();
			return str.substring(7, str.indexOf(" "));
		}
		return "";
	}

	//dbからtable champを出力
	static void champTableOutput() {
		try {
			String sql;

			sql = "select * from champ";
			ResultSet rs = stmt.executeQuery(sql);

			while (rs.next()) {
				System.out.println(rs.getString("name") + " " + rs.getDouble("usegeRate") + " "
						+ rs.getDouble("winRate") + " " + rs.getDate("date"));
			}

			rs.close();
			stmt.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	//何度も同じURLにアクセスしないようにファイルに書き出しておいて、同じURLだった場合は書きだしておいたファイルから読み出す
	//TODO 書きだされたファイルが古い場合は、再度アクセスするようにしたい
	static String fileHttpGet(String urlStr){
		String urlRep=urlStr.replaceAll("[\\/:*?\"<>|]", "");
		File file=new File("html/"+urlRep+".txt");
		if(file.exists()){
			return readFile("html/"+urlRep+".txt");
		}else{
			String res=httpGet(urlStr);
			writeFile("html/"+urlRep+".txt",res);
			return res;
		}
	}

	//fileNameで読み出し
	static String readFile(String fileName) {
		StringBuilder sb = new StringBuilder();
		try {
			FileReader in = new FileReader(fileName);
			BufferedReader br = new BufferedReader(in);
			String line;
			while ((line = br.readLine()) != null) {
				sb.append(line);
				sb.append("\n");
			}
			br.close();
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return new String(sb);
	}
	
	//fileNameにcontentを書きだして保存
	static void writeFile(String fileName,String content){
		try {
			FileWriter fw=new FileWriter(new File(fileName));
			fw.write(content);
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	//URLからhtmlを持ってくる
	static String httpGet(String urlStr) {
		StringBuilder sb = new StringBuilder();
		try {
			Object content = new URL(urlStr).getContent();
			if (content instanceof InputStream) {
				BufferedReader br = new BufferedReader(new InputStreamReader((InputStream) content));
				String line;
				while ((line = br.readLine()) != null) {
					sb.append(line);
					sb.append("\n");
				}
				br.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return new String(sb);
	}
}