今天闲来无事,凭着对大数据和海量数据的浓厚兴趣,把很久之前想写但没写完的程序坚持写完了,下面简要介绍一下吧。
这些程序的主要目的是统计世界大学的信息,主要的数据来源就是人人网了,在人人网上有一个接口,就是在查询大学数据的时候,通过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,打包的项目放在附件中,有兴趣的可以去下载。
- 大小: 27.9 KB
- 大小: 26.7 KB
分享到:
相关推荐
人人网可能提供了公开的数据接口,或者可以通过解析HTML页面来获取大学的名称、位置、排名等数据。 描述中提到的“NULL”意味着没有提供具体的操作步骤或实现细节,但我们可以根据一般的做法来推测。首先,我们需要...
一共包含了全国3049所大学, 从人人网拷贝的 (仅供学习交流, 请勿用于商业项目)
这需要通过监听省份选择的改变事件,然后根据选择的省份加载相应的城市和大学数据。 3. **JavaScript数据结构**:由于学校数据保存在JS中,我们需要有效地存储和访问这些数据。可以使用对象或者数组来组织数据,...
描述中提到的“人人网最新高校数据 高中 大学 省市”表明这是一个包含中国各地学校信息的数据库,可能是从人人网这个社交平台获取的最新数据。它涵盖了高中和大学的级别,以及学校的地理位置信息,即省市。标签 ...
标题中的“抓取网上信息,抓取人人网院校”指的是网络爬虫技术在特定场景的应用,即通过编程方式从人人网这样一个社交平台获取与院校相关的信息。网络爬虫是自动化地从互联网上提取大量数据的一种程序,它通常由网页...
【标题】"仿人人注册高校/大学级联选择JS代码"是针对网页中实现高校或大学级联选择功能的一种JavaScript实现。在网页表单中,级联选择通常用于让用户逐级选择,例如先选择省份,然后根据省份选择城市,再根据城市...
在这个项目中,C#主要用于后端逻辑处理,包括数据的获取、存储和处理。 接着,我们看到“全国高校选择表”这个概念,这暗示了应用的核心功能是关于中国各高校的信息展示和检索。开发者可能已经整合了全国各大高校的...
1. **人人网的基本情况**:人人网原名校内网,最初定位为大学生社交平台,后来扩展到更广泛的用户群体。它以实名制为基础,强调真实的社交关系,用户可以发布状态、分享照片、参与讨论等。 2. **人人网的功能**:...
与Facebook相比,人人网的用户基础单一,主要是大学生群体,并且一旦这些用户毕业,他们往往会选择转向其他社交平台。这导致了人人网的广告价值受限,难以像Facebook那样吸引广告主,形成与Google竞争的地位。 在...
人人网是中国早期的一款社交媒体平台,它提供了个人主页、发布动态、分享照片、添加好友等功能,深受大学生群体喜爱。仿网人系统正是基于这样的背景,尝试复刻这一经典平台的核心功能,让用户能在自己的平台上体验到...
在互联网的早期阶段,校内网(又称人人网)是中国大学生社交网络的热门平台,其中的相册功能让用户能够分享生活瞬间,保存珍贵记忆。然而,随着社交媒体的快速发展,用户可能面临数据迁移或备份的需求。这时,"校内...
【JS仿人人网高校级联选择】是一种常见的前端交互设计,用于模拟人人网中的高校选择功能,用户在选择学校时,会根据所选的国家或地区动态加载对应的学校列表。这个实现主要基于JavaScript(JS)和jQuery库,使得在...
现代社交工具如QQ、微信、微博以及社交网络服务平台如人人网等,在大学生群体中非常流行。这些工具不仅方便了大学生之间的沟通,还促进了信息的快速传播。然而,社交网络的使用也可能导致大学生在现实生活中的人际...
人人网曾是中国大学生广泛使用的社交平台,其客户端源码对于学习社交应用的架构设计、用户管理、好友系统、动态分享等功能具有很高的价值。开发者可以通过研究源码,学习如何在Android平台上实现类似的社交功能,...
而经常使用的社交网站列表(如人人网、QQ空间、微博等)则揭示了大学生偏好的社交平台,这些平台的功能和特点满足了他们的互动需求。 在个人信息真实性方面,大学生的态度各异,这可能与隐私保护意识、社交需求和...
3. 社交网站使用情况:调查涉及了人人网、QQ校友网、开心网等,这些网站反映了早期社交媒体的流行趋势,而如今,微信、抖音等新兴平台可能更为大学生所青睐。 4. 使用时间和频率:了解学生每天在网络社交上花费的...
同时,网络游戏也是大学生网络生活中的一部分,他们在游戏中的投入时间、花费、声望和信誉等级反映出网络世界的另一种身份和地位。 然而,与网络社交相比,大学生在现实社交中的表现可能有所不同。他们在学业、学生...
人人网大讲堂“特约讲师”、CCF“特邀讲师”,论文在 Google Scholar 中被引用达 500 余次。 美国印第安那大学普适计算研究所作博士后研究生,曾受聘于芝加哥大学美国能源部阿岗国家实验室,担任研究科学家职务,...