文档章节

抓取人人网高校数据----仅供学习

小雪纷飞
 小雪纷飞
发布于 2016/12/08 15:10
字数 744
阅读 91
收藏 1
点赞 1
评论 0

获取人人网的高校数据。

人人网的院系接口,参数为高校id:    http://www.renren.com/GetDep.do?id=

人人网  (国家/省/高校 js文件):   http://s.xnimg.cn/a13819/allunivlist.js

仅供学习参考

仅供学习参考

仅供学习参考

1.通过fastJson解析获取到的高校json

2.通过正则表达式解析获取到的院系html

package com.test;

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
  
/**
 * @desc 获取人人网高校数据
 * @author wjw
 * @date 2016年12月8日下午1:21:01
 */
public class GetSchoolSQL {  
    // 构建省的sql文件  
    public static File provinceFile = new File("D:/province.sql");  
    // 构建高校的sql文件  
    public static File schoolFile = new File("D:/school.sql");  
    // 构建院系的sql文件  
    public static File depFile = new File("D:/dep.sql");  
  
    
    public static void getDate() throws ClientProtocolException, IOException{
    	 HttpClient client = new DefaultHttpClient();  
         ResponseHandler<String> responseHandler = new BasicResponseHandler();  
         String depUrl = "http://www.renren.com/GetDep.do?id=";
         String allunivs = "http://s.xnimg.cn/a13819/allunivlist.js";
         HttpGet get = new HttpGet(allunivs);  
         StringBuffer sb = new StringBuffer(client.execute(get, responseHandler));  
         String str=sb.toString();
         System.out.println("获取高校js文件完成,下一步解析js文件的JSON数据:");
         
         JSONArray objList= JSONObject.parseArray(str.substring(str.indexOf("[{")));//获取json部分
         // 对获取jsonarry  取中国部分id="00"
         JSONArray china = null;//取中国部分provs
         if(objList!=null){
     		for(int i=0;i<objList.size();i++){
     			JSONObject obj=objList.getJSONObject(i);
     			if(obj.getIntValue("id") != 00){//搞不懂json中国家id为字符串这里需要int类型判断
     				continue;
     			}else{
     				china=obj.getJSONArray("provs");
     			}
     		}
     	}
         System.out.println("中国高校JSON数据:\r\n"+china.toJSONString());
         System.out.println("=============================开始解析JSON==================================");
         StringBuilder provinceSql = new StringBuilder();//省sql
         StringBuilder schoolSql = new StringBuilder();//大学sql
         StringBuilder depSql = new StringBuilder();//院系sql
 		for(int i=0;china!=null && i<china.size();i++){//遍历省
 			JSONObject pObj=china.getJSONObject(i);
 			provinceSql.append("insert into province(pro_id,pro_name)values('"+pObj.getIntValue("id")+ "','"+ convertFromHex(pObj.getString("name")) + "');\n");
 			
 			JSONArray univs = pObj.getJSONArray("univs");//univs 获取省学校集合
     		for(int j=0;univs!=null && j<univs.size();j++){//遍历省学校
     			JSONObject sObj=univs.getJSONObject(j);
     			//添加省学校sql
     			schoolSql.append("insert into school(pro_id,sch_id,sch_name)values('"+pObj.getIntValue("id")+ "','"+ sObj.getIntValue("id")+ "','"+ convertFromHex(sObj.getString("name"))+"');\n");
     			//获取学校院系
     			HttpGet getDep = new HttpGet(depUrl + sObj.getIntValue("id"));
     			ResponseHandler<String> depHandler = new BasicResponseHandler();  
     			String depHtml=client.execute(getDep, depHandler);//获取院系html
     			
// 	    			下面解析学校对应的院系html
             	Pattern pattern = Pattern.compile("<option value='&#(.*?)</option>",Pattern.MULTILINE); //排除value为空的项 
                 Matcher matcher = pattern.matcher(depHtml);  
         		while (matcher.find()) {
         			String value = "";
         			String data = matcher.group();// date结果为<option value='&#20854;&#23427;&#38498;&#31995;'>&#20854;&#23427;&#38498;&#31995;</option>
         			Pattern p = Pattern.compile("value='(.*?)'", Pattern.MULTILINE);
         			Matcher m = p.matcher(data);
         			if (m.find()) {
         				value = m.group(1);
         			}
         			String id = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
         			depSql.append("insert into dep(id,sch_id,dep_name)values('"+id+"','"+sObj.getIntValue("id") +"','"+convertFromDec(value)+"');\n");
         		}
     		}
 			
 		}
              
         System.out.println("=============================JSON解析完成==================================");
         PrintStream ps = new PrintStream(provinceFile);  
         ps.print(provinceSql.toString());  
         ps.close();  
   
         PrintStream ps2 = new PrintStream(schoolFile);  
         ps2.print(schoolSql.toString());  
         ps2.close();  
   
         PrintStream ps3 = new PrintStream(depFile);  
         ps3.print(depSql.toString());  
         ps3.close();
         System.out.println("sql文件已经生成!");
         System.out.println("省sql文件"+provinceFile.getAbsolutePath());
         System.out.println("学校sql文件"+schoolFile.getAbsolutePath());
         System.out.println("院系sql文件"+depFile.getAbsolutePath());
    }
  
	public static void main(String[] args){
		try {
			getDate();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
  
    // 转换&#xxxxx;形式Unicode  
    private static String convertFromDec(String code) {  
        StringBuffer sb = new StringBuffer(code);  
        int startPos;  
        int endPos;  
        while ((startPos = sb.indexOf("&#")) > -1) {  
            endPos = sb.indexOf(";");  
            String tmp = sb.substring(startPos + 2, endPos);  
            sb.replace(startPos, endPos + 1, Character.toString((char) Integer  
                    .parseInt(tmp, 10)));  
        }  
        return code = sb.toString();  
    }  
  
    // 转换16进制的Unicode,  
    private static String convertFromHex(String code) {  
        StringBuffer sb = new StringBuffer(code);  
        int pos;  
        while ((pos = sb.indexOf("\\u")) > -1) {  
            String tmp = sb.substring(pos, pos + 6);  
            sb.replace(pos, pos + 6, Character.toString((char) Integer  
                    .parseInt(tmp.substring(2), 16)));  
        }  
        return code = sb.toString();  
    }  

}  

 

© 著作权归作者所有

共有 人打赏支持
小雪纷飞
粉丝 3
博文 15
码字总数 8311
作品 1
武汉
个人站长
用HttpClient抓取人人网高校数据库(省,高校,院系三级级联)--更新1

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

倚小丁 ⋅ 2011/04/17 ⋅ 4

Python3抓取糗百、不得姐、kanqu.com

测试电脑配置有点低,正常配置速度会比较快. 有问题可以加群:544471255 交流. 使用必看: 1.该代码使用Python3.6+版本; 2.需要安装依赖库如下(可使用类似:pip install requests进行安装.下面...

dcxy0 ⋅ 2017/05/06 ⋅ 0

HTTPClient模拟登陆人人网

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

落落的月 ⋅ 2012/05/11 ⋅ 0

gaokao--抓取高校基本信息

查询高考的信息,我们长浏览的数据:高校的信息,每年每个省市的批次分数线,专业的简介,高校的录取分数等等。需要大量的数据,可是数据不可能人工输入啊?如果是人工的话,连想都不敢想啊,...

cookqq ⋅ 2013/01/18 ⋅ 0

python爬虫抓取站长之家IP库,仅供练习用!

python爬虫抓取站长之家IP库,单线程的,仅供练习,IP库数据有43亿条,如果按此种方法抓取至少得数年,所以谨以此作为练手,新手代码很糙,请大家见谅。 #!/usr/bin/python coding=UTF-8 imp...

苍狼牧 ⋅ 2017/03/13 ⋅ 0

请问用Python怎么抓取动态网页?

@西门飞 你好,想跟你请教个问题:我想要抓取人人网好友列表,浏览器页面显示有很多的好友。但是查看源代码是没有的,通过查询网络发现貌似是动态数据的原因,想问问用python如何解决这个问题...

llwang ⋅ 2014/04/22 ⋅ 3

vue2.0音乐播放器

上手vue.js之后,选择的第一个项目就是音乐播放器,使用qq音乐的api,界面仿腾讯本地音乐播放器“轻听”,功能包括最近播放、添加到喜欢、榜单详情、歌手详情、专辑详情。技术栈基本是vue全家...

Gesangs ⋅ 2017/11/09 ⋅ 0

《CURL技术知识教程》系列技术教程整理

《CURL技术知识教程》系列技术教程整理 有时间会不断更新,大家有什么好的推荐的可以在下面回复,我会酌情收录 1PHP采集相关教程之一 CURL函数库 2php中通过curl模拟登陆discuz论坛的实现代码...

开元中国2015 ⋅ 2015/05/07 ⋅ 0

Swift版饭否--Ifanfou

饭否是中国大陆地区第一家提供微博服务的网站,被称为中国版Twitter。用户可通过网页、WAP、手机短信/彩信、IM 软件(包括 QQ、MSN、GTalk)和上百种API 应用在自己的饭否页面上发布消息或上...

tungleungs ⋅ 2016/03/15 ⋅ 0

python访问需要登录的网页遇到点问题

#encoding=utf-8import urllib2import urllibimport cookielib def scuGradeBrower(url,user,password): f = open('renrenwang.html', 'w')content = scuGradeBrower("http://www.renren.com......

林夕_信仰 ⋅ 2013/09/06 ⋅ 8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NFS介绍 NFS服务端安装配置 NFS配置选项

NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导...

lyy549745 ⋅ 23分钟前 ⋅ 0

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人 ⋅ 46分钟前 ⋅ 0

HTML-标签手册

标签 描述 <!--...--> 定义注释。 <!DOCTYPE> 定义文档类型。 <a> 定义锚。超链接 <abbr> 定义缩写。 <acronym> 定义只取首字母的缩写。 <address> 定义文档作者或拥有者的联系信息。 <apple......

ZHAO_JH ⋅ 47分钟前 ⋅ 0

SylixOS在t_main中使用硬浮点方法

问题描述 在某些使用场景中,应用程序不使用动态加载的方式执行,而是跟随BSP在 t_main 线程中启动,此时应用代码是跟随 BSP 进行编译的。由于 BSP 默认使用软浮点,所以会导致应用代码中的浮...

zhywxyy ⋅ 55分钟前 ⋅ 0

JsBridge原理分析

看了这个Github代码 https://github.com/lzyzsd/JsBridge,想起N年前比较火的Hybrid方案,想看看现在跨平台调用实现有什么新的实现方式。代码看下来之后发现确实有点独特之处,这里先把核心的...

Kingguary ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧五-真正常用快捷键(收藏级)

如果你觉得前面几篇博文太啰嗦,下面是博主多年使用Intellij IDEA真正常用快捷键,建议收藏!!! sout,System.out.println()快捷键 fori,for循环快捷键 psvm,main方法快捷键 Alt+Home,导...

Mkeeper ⋅ 今天 ⋅ 0

Java 静态代码分析工具简要分析与使用

本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,...

Oo若离oO ⋅ 今天 ⋅ 0

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱...

大_于 ⋅ 今天 ⋅ 0

React jsx 中写更优雅、直观的条件运算符

在这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符 Conditional Operator condition ? expr_if_true : expr_if_false 在jsx中书写条件语句我们经常都...

开源中国最帅没有之一 ⋅ 今天 ⋅ 0

vim编辑模式与命令模式

5.5 进入编辑模式 从编辑模式返回一般模式“Esc” 5.6 vim命令模式 命令 :“nohl”=no high light 无高亮,取消内容中高亮标记 "x":保存退出,和wq的区别是,当进入一个文件未进行编辑时,使...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部