文档章节

获取世界大学数据(人人网)

大钻风
 大钻风
发布于 2016/06/20 19:21
字数 1651
阅读 5
收藏 0

今天闲来无事,凭着对大数据和海量数据的浓厚兴趣,把很久之前想写但没写完的程序坚持写完了,下面简要介绍一下吧。

这些程序的主要目的是统计世界大学的信息,主要的数据来源就是人人网了,在人人网上有一个接口,就是在查询大学数据的时候,通过Ajax会向后台发送一个请求(http://s.xnimg.cn/a27085/allunivlist.js),这个请求的返回值就是一个js文件,而这个js文件就是一个很大的json对象,然后通过解析这个json对象就可以得到世界大学的信息了。

原来在论坛里面已经有人对此做了实现(http://www.iteye.com/topic/1118508),不过貌似比较复杂,源码看得都累了,所以自己想做一个实现,简化一些操作。

首先就是要保存下来这个js文件,对保存下来的js文件稍作修改:var allUnivList = [{"id":"00","univs":"",改成[{"id":0,"univs":"",也就是把前面变量定义去掉,因为已经没用了,还有就是把00改成0。基本上就是这些,下面是工程的源代码:

首先说明一下,要看得懂这里的源代码,其实还是需要花费一段时间的,主要就是对那个很大的json对象要很熟悉,下面是我整理出的一个对象框架,希望能让读者受益:(考虑到阅读方便,这里已经做了转码)

[{"id":0,"univs":"","name":"中国","provs":[//像中国这样的,国家没有大学,只有省市级别的才有大学
	{"id":1,"univs":[{"id":1001,"name":"清华大学"}...{"id":2000,"name":"中北国际演艺学校"}],"country_id":0,"name":"北京"},
	{"id":2,"univs":[{"id":2001,"name":"复旦大学"}...{"id":2169,"name":"上海大学巴士汽车学院"}],"country_id":0,"name":"上海"},
	...
	{"id":32,"univs":[{"id":32001,"name":"香港大学"}...{"id":32013,"name":"The Open University of HongKong"}],"country_id":0,"name":"香港"},
	...
	{"id":34,"univs":[{"id":34001,"name":"国立台湾大学"}...{"id":34055,"name":"铭传大学 "}],"country_id":0,"name":"台湾"}
]},
...//省略了很多国家
{"id":"28","univs":[//像印度这样的,没有省市级别的大学只有国家的大学
	{"id":2800001,"name":"University of Delhi"}...{"id":2800008,"name":"St.xavier's College"}],
"name":"印度","provs":""},
{"id":"29","univs":[//奥地利也和印度一样只有国家级别的大学
	{"id":2900001,"name":"Akademie der bildenden Künste Wien"}...{"id":2900110,"name":"Wirtschaftsuniversität Wien "}],
"name":"奥地利","provs":""}]

 

 下面就是真正的源代码:

UniBean.java

package com.universities.samples;

public class UniBean {

	private Integer id;
	private String name;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 

 ProBean.java

package com.universities.samples;

public class ProBean {

	private Integer id;
	private String univs;
	private Integer country_id;
	private String name;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUnivs() {
		return univs;
	}
	public void setUnivs(String univs) {
		this.univs = univs;
	}
	public Integer getCountry_id() {
		return country_id;
	}
	public void setCountry_id(Integer country_id) {
		this.country_id = country_id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 

 ConBean.java

package com.universities.samples;

public class ConBean {

	private Integer id;
	private String univs;
	private String name;
	private String provs;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUnivs() {
		return univs;
	}
	public void setUnivs(String univs) {
		this.univs = univs;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getProvs() {
		return provs;
	}
	public void setProvs(String provs) {
		this.provs = provs;
	}
	
}

 

 University.java

package com.universities.samples;

public class University {

	private Long id;//自动生成。主要为防止冲突的
	private String name;//大学名称
	private Integer cid;//国家编号
	private String county;//国家名
	private Integer pid;//省市编号
	private String province;//省市名
	private Integer uid;//大学在国家里的编号
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getCid() {
		return cid;
	}
	public void setCid(Integer cid) {
		this.cid = cid;
	}
	public String getCounty() {
		return county;
	}
	public void setCounty(String county) {
		this.county = county;
	}
	public Integer getPid() {
		return pid;
	}
	public void setPid(Integer pid) {
		this.pid = pid;
	}
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public Integer getUid() {
		return uid;
	}
	public void setUid(Integer uid) {
		this.uid = uid;
	}
}

 

 UniDao.java

package com.universities.samples;

import java.sql.Connection;

public class UniDao {
	private static Connection connection = null;
	private UniDao(){}
	private static UniDao instance = new UniDao();
	
	public static UniDao getInstance(){
		return instance;
	}

	public static Connection getConnection() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager.getConnection(
					"jdbc:mysql://localhost:9906/school", "root", "root");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
	}

	// 插入数据的方法
	public static boolean insertUni(University university) {
		boolean bool = false;
		getConnection();
		String sql = "insert into university(name,cid,county,pid,province,uid) values(?,?,?,?,?,?)";
		try {
			PreparedStatement statement = connection.prepareStatement(sql);
			statement.setString(1, university.getName());
			statement.setInt(2, university.getUid());
			statement.setString(3, university.getCounty());
			statement.setInt(4, university.getPid());
			statement.setString(5, university.getProvince());
			statement.setInt(6, university.getUid());
			if (statement.executeUpdate() > 0) {
				bool = true;
			}
			statement.close();
			connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return bool;
	}
}

 

 Main.java

package com.universities.samples;

import java.io.BufferedReader;

public class Main {

	private static List<UniBean> uniBeans = new ArrayList<UniBean>();
	private static Map<ProBean, List<UniBean>> proBeans = new HashMap<ProBean, List<UniBean>>();
	
	//主体方法,负责读入文件,将文件中的json对象转换成对应的Bean然后整理之后插入到数据库中
	public void convert(File fileName){
		try {
			BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
			String content = null;
			while ((content = bf.readLine())!=null) {//文件正文只有一行
				while (content.indexOf("}")>0) {
					String temp = content.substring(0, content.indexOf("}")+1);
					String temp1 = temp.substring(temp.lastIndexOf("{"),temp.length());
					if (!temp1.contains("univs")) {
						JSONObject jsonObject = JSONObject.fromObject(temp1);
						UniBean uniBean = (UniBean)JSONObject.toBean(jsonObject,UniBean.class);
						uniBeans.add(uniBean);
					}else if (!temp1.contains("provs")) {
						temp1 = temp1.replaceAll("\\[[^\\]]*\\]", "\"\"");
						JSONObject jsonObject = JSONObject.fromObject(temp1);
						ProBean proBean = (ProBean)JSONObject.toBean(jsonObject,ProBean.class);
						if (uniBeans.size()>0) {
							String county = content.substring(content.indexOf("name")+7,content.indexOf("provs")-3);
							for (UniBean uniBean : uniBeans) {
								University university = new University();
								university.setName(uniBean.getName());
								university.setCid(proBean.getCountry_id());
								university.setCounty(UnicodeToGB2312(county));
								university.setPid(proBean.getId());
								university.setProvince(proBean.getName());
								university.setUid(uniBean.getId());
								if (UniDao.insertUni(university)) {
									System.out.println(university.getUid()+university.getCounty()+university.getName());
								}
							}
							uniBeans.clear();
						}
					}else {
						temp1 = temp1.replaceAll("\\[[^\\]]*\\]", "\"\"");
						JSONObject jsonObject = JSONObject.fromObject(temp1);
						ConBean conBean = (ConBean)JSONObject.toBean(jsonObject,ConBean.class);
						if (proBeans.size()<=0 && uniBeans.size()>0) {//说明这个国家只有国家大学
							for (UniBean uniBean : uniBeans) {
								University university = new University();
								university.setName(uniBean.getName());
								university.setCid(conBean.getId());
								university.setCounty(conBean.getName());
								university.setPid(0);
								university.setProvince(conBean.getProvs());
								university.setUid(uniBean.getId());
								if (UniDao.insertUni(university)) {
									System.out.println(university.getUid()+university.getCounty()+university.getName());
								}
							}
						}
						uniBeans.clear();
					}
					content = content.substring(0, temp.lastIndexOf("{"))+content.substring(content.indexOf("}")+1, content.length());
				}
			}
			bf.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	//转换字符编码,将所有的unicode替换成中文编码(gbk)
	public static String UnicodeToGB2312(String str) {
		String res = null;
		StringBuffer sb = new StringBuffer();
		try {
			while (str.length() > 0) {
				if (str.startsWith("\\u")) {
					int x = Integer.parseInt(str.substring(2, 6), 16);
					sb.append((char) x);
					str = str.substring(6);
				} else {
					sb.append(str.charAt(0));
					str = str.substring(1);
				}
			}
			res = sb.toString();
		} catch (Exception e) {
			e.printStackTrace(System.err);
		}
		return res;
	}
	
	public static void main(String[] args) {
		new Main().convert(new File("src//schools.txt"));
	}
}

 

 还有的就是不能少了的schools.txt因为文件较大,就不贴出来了,在附件中有下载。

代码写的很清晰,基本上不需要太多的解释,把数据全部插入到数据库中以后,在navicat中做了这样一个查询,就是统计每个国家的大学数量,然后按照数量降序排列:

首先比较惊讶的应该是中国和美国的差距,然后就是小日本这样的弹丸之国居然有这么高的大学数量,确实很让人深思。

然后还有一张就是下面的这张图片,这样看的话,江苏很给力呀,如果不出意外的话这张图基本上就代表了省市的经济实力吧,呵呵。

好吧,还是以技术为主,其他的还是少聊吧,项目中用到了json-lib,打包的项目放在附件中,有兴趣的可以去下载。

 

本文转载自:http://yiyiboy2010.iteye.com/blog/1510638

上一篇: 贪心算法
下一篇: 技术杂项整理
大钻风
粉丝 3
博文 22
码字总数 0
作品 0
杭州
高级程序员
私信 提问
【北京】人人网 招聘 C++ Java 开发工程师 架构师

人人网IM系统高级C++开发工程师 工作地点:北京 工作类别:技术类 工作描述: 1)责负人人桌面服务器端的开发; 2)责负网站的实时聊天及实时消息推送系统的开发 3)系统的优化,改进及日常维...

antonio
2011/11/25
931
3
用HttpClient抓取人人网高校数据库(省,高校,院系三级级联)--更新1

更新备注:将src文件改成了一个完整的项目,解压后可以直接导入到Eclipse中去,省去大家配置(项目乱码请改项目属性为GBK)。另外,如果你要登陆人人网 的话,需要申请一个人人网账号。这里提...

倚小丁
2011/04/17
2.4K
4
抓取人人网高校数据----仅供学习

获取人人网的高校数据。 人人网的院系接口,参数为高校id: http://www.renren.com/GetDep.do?id= 人人网 (国家/省/高校 js文件): http://s.xnimg.cn/a13819/allunivlist.js 仅供学习参考 仅供...

小雪纷飞
2016/12/08
144
0
哇,终于有了合伙人网

在这个竞争如此激烈的社会,创业者最可怕的事情不是你遭遇了人生最大的痛苦,而是你缺少与你同呼吸,同命运的合伙人。正因为缺少这种志同道合的合伙人,你才会感觉颠沛流离,让原本完整的自我...

zen
2016/09/21
0
1
HTTPClient模拟登陆人人网

目的: 使用HTTPClient4.0.1登录到人人网,并从特定的网页抓取数据。 总结&注意事项: HttpClient(DefaultHttpClient)代表了一个会话,在同一个会话中,HttpClient对cookie自动进行管理(当然,...

落落的月
2012/05/11
791
0

没有更多内容

加载失败,请刷新页面

加载更多

新建作业20191011121223

2.编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound,Sally shouted,"By the Great Pumpkin,what was that!" #include<stdio.h>int main(){printf("\a");......

电子197朱妍
23分钟前
3
0
家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
43分钟前
6
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
44分钟前
6
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
47分钟前
10
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
51分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部