阿里地区比赛排名获取

阿里比赛排名获取

最近阿里巴巴的大数据比赛(http://102.alibaba.com/competition/addDiscovery/index.htm)比较的火,实验室有好几组都参加了,但是阿里的结果是显示前500名的结果,查看十分的不方便,虽然可以登录进去查看自己的成绩,始终感觉不是太方便。阿里比赛排行榜页面(http://102.alibaba.com/competition/addDiscovery/totalRank.htm),查看源代码,发现数据获取方式如下:

 pageObj.on("page:skip", function(e){
	                        c_page=Number(e.pageNum);
	                        S.io({
	                            type:'POST',
	                            url:'/competition/addDiscovery/queryTotalRank.json',
	                            data:{
	                                'pageIndex':c_page,
	                                'pageSize':20
	                            },
	                            success:function(data){
	                                $(".admin-all").removeAttr("checked");
	                                var pageObj = new page({
	                                    container: "#page", // 容器
	                                    total_page: data.returnValue.totalPage, // 总页数
	                                    continuous_page: 3, // 连续显示分页数
	                                    current_page: c_page, // 当前页
	                                    first_page: true, // 首页
	                                    preview_show: true, // 是否显示第一页
	                                    next_show: true, // 是否显示下一页
	                                    last_show: true, // 最后一页
	                                    edge_page: 2, // 两端显示分页数
	                                    skip_show: true // 是否显示跳转
	                                });
	                                dataListFn(data.returnValue.datas);
	                            },
	                            error:function(e){
	                                alert("未请求到数据!");
	                            },
	                            dataType:'json'
	                        });
	                    });
	                },
	                error:function(e){
	                    alert("未请求到数据!");
	                },
	                dataType:'json'
	            });

由上述网页源代码可以看出,整体是向http://102.alibaba.com/competition/addDiscovery/queryTotalRank.json这个页面以post方式提交了页号以及需要请求数据的数量,于是我就使用相同的操作,获取前2000名有关科大的排名。有时候不得不说大公司就是不一样,经过3天后,阿里竟然将服务端做了更改,每次只返回20条数据。也无所谓了,无非多个循环了。

主要代码如下:

package cn.edu.ustc.dm.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import cn.edu.ustc.dm.bean.AliTop;
import cn.edu.ustc.dm.bean.Team;

import com.google.gson.Gson;

/**
 * 获取阿里科大排名
 * @author Yuedong Li
 *
 */
public class RankInfo {

	private static List<Team> teams = new ArrayList<Team>();
	private static long refreshTime = System.currentTimeMillis();

	public static List<Team> getRank(int pageIndex) {
		String address = "http://102.alibaba.com/competition/addDiscovery/queryTotalRank.json";
		try {
			HttpURLConnection conn = (HttpURLConnection) new URL(address)
					.openConnection();
			conn.setRequestMethod("POST");
			conn.setDoOutput(true);
			conn.getOutputStream().write(
					("pageIndex=" + pageIndex + "&&pageSize=20").getBytes());

			BufferedReader buff = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));
			String line;
			StringBuffer source = new StringBuffer();
			while ((line = buff.readLine()) != null) {
				source.append(line);
				source.append('\n');
			}

			Gson gson = new Gson();
			AliTop aliTop = gson.fromJson(source.toString(), AliTop.class);

			List<Team> teams = aliTop.getReturnValue().getDatas();
			return teams;

		} catch (IOException e) {
			e.printStackTrace();
		}
		return new ArrayList<Team>();
	}

	/**
	 * 获取阿里前500排名
	 * @return
	 */
	public static List<Team> getAllRank() {
		long nowTime = System.currentTimeMillis();
		if (teams.size() == 0 || nowTime - refreshTime >= 7200000) {
			refreshTime = nowTime;
			List<Team> teamTmp;
			for (int i = 1; i <= 25; i++) {
				teamTmp = getRank(i);
				for (int j = 0; j < teamTmp.size(); j++)
					teams.add(teamTmp.get(j));
			}
		}
		return teams;
	}
}


由于阿里返回的数据是json格式的,这里使用Gson包对其进行转化,即json---> bean的转化了。数据每2小时刷新一次。

定义的一些bean如下:

package cn.edu.ustc.dm.bean;

public class AliTop {
	private boolean isSuccess;
	private ReturnValue returnValue;
	public boolean isSuccess() {
		return isSuccess;
	}
	public void setSuccess(boolean isSuccess) {
		this.isSuccess = isSuccess;
	}
	public ReturnValue getReturnValue() {
		return returnValue;
	}
	public void setReturnValue(ReturnValue returnValue) {
		this.returnValue = returnValue;
	}
	
}

package cn.edu.ustc.dm.bean;

import java.util.List;

public class ReturnValue {
	private int pageSize;
	private int pageIndex;
	private List<Team> datas;

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getPageIndex() {
		return pageIndex;
	}

	public void setPageIndex(int pageIndex) {
		this.pageIndex = pageIndex;
	}

	public List<Team> getDatas() {
		return datas;
	}

	public void setDatas(List<Team> datas) {
		this.datas = datas;
	}

}

package cn.edu.ustc.dm.bean;

public class Team {
	private String id;
	private String date;
	private String university;
	private Double score;
	private Double precision;
	private Double recall;
	private String rank;
	private String teamName;
	private String dateString;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public String getUniversity() {
		return university;
	}
	public void setUniversity(String university) {
		this.university = university;
	}
	public Double getScore() {
		return score;
	}
	public void setScore(Double score) {
		this.score = score;
	}
	public Double getPrecision() {
		return precision;
	}
	public void setPrecision(Double precision) {
		this.precision = precision;
	}
	public Double getRecall() {
		return recall;
	}
	public void setRecall(Double recall) {
		this.recall = recall;
	}
	public String getRank() {
		return rank;
	}
	public void setRank(String rank) {
		this.rank = rank;
	}
	public String getTeamName() {
		return teamName;
	}
	public void setTeamName(String teamName) {
		this.teamName = teamName;
	}
	public String getDateString() {
		return dateString;
	}
	public void setDateString(String dateString) {
		this.dateString = dateString;
	}

	
}

这样就获取了所有的排名,从中过滤出科大的队伍,展示一下就可以了,如下:

<%@page import="java.text.DecimalFormat"%>
<%@page
	import="cn.edu.ustc.dm.util.*,cn.edu.ustc.dm.bean.*,java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>科大阿里排名</title>
</head>
<body>
	<center>
	<h2>科大阿里比赛排名</h2>
		<table width="90%" border="1">
			<tr>
				<td align="center" style="color: green;">序号</td>
				<td align="center" style="color: green;">队名</td>
				<td align="center" style="color: green;">F1</td>
				<td align="center" style="color: green;">准确率</td>
				<td align="center" style="color: green;">召回率</td>
				<td align="center" style="color: green;">最优提交时间</td>
				<td align="center" style="color: green;">排名</td>
			</tr>
			<%
				DecimalFormat df = new DecimalFormat("##.000");
				List<Team> teams = RankInfo.getAllRank();
				int num = 0;
				for (int i = 0; i < teams.size(); i++) {
					Team team = teams.get(i);
					if (!team.getUniversity().equals("中国科学技术大学"))
						continue;
					if (num++ % 2 == 1) {
			%>
			<tr style="background-color: #eeeeee;">

				<%
					} else {
				%>
			
			<tr>
				<%
					}
				%>
				<td align="center"><%=num%></td>
				<td align="center" style="color: red;"><%=team.getTeamName()%></td>
				<td align="center"><%=df.format(team.getScore()*100)%>%</td>
				<td align="center"><%=df.format(team.getPrecision()*100)%>%</td>
				<td align="center"><%=df.format(team.getRecall()*100)%>%</td>
				<td align="center"><%=team.getDateString()%></td>
				<td align="center" style="color: blue;"><%=team.getRank()%></td>
			</tr>
			<%
				}
			%>
		</table>
		<br>
	</center>
</body>
</html>

好了,终于可以了,部署在自己的机器上,使用ssh反向隧道将自己的机器映射到服务器一个端口,现在就可以访问了,http://ali.androiddevelop.cn。最后为科大的这帮小伙伴们加油!!