`

用HttpClient抓取人人网高校数据库(省,高校,院系三级级联)--更新1

    博客分类:
  • Java
阅读更多

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

lei.d0809@gmail.com

java123456

请自行修改RenRenNotify.java 对应的东西。


       首先文章有点长,需要点耐心。这里我是一步一步的做的。。。。比较的细,如果你是代码达人,那你就直接下载代码吧。

      有人说图片看不清,我抱歉,第一次咱的图片不完美,你把图片在浏览器上拖动到新窗口,就可以看到你大图了。

 

 


       需求来源,最近学校的课程项目需要一个省,高校,院系的三级级联的东西,这下麻烦了。全国那么多的高校,而且每一个高校的院系设置又不一样,我们小组只有六个人,而且技术都不咋地,要统计那么多的数据,我们估计这学期就别想完成这个项目了。但是我们知道人人网,开心网,腾讯微博上都要高校的数据库,于是想法就产生了:

     1.要么咱拼人品让他们的技术人员给我们他们的数据库,想法是好的,但是人家不肯呀

     2.要么咱通过某种手段获取他们的数据

今天,咱选择第二种。用到工具有:

EditPlus:小巧好用的文本编辑器,是超越的文本编辑器,不解释,用了就知道

Apanta:这个强烈推荐,用它来写Html,Javascript,Css感觉非常好,而且支持各种各样的Javascript的库,如:

               Jquery,但是我想把他集成到MyEclipse上去,出了一点问题,遗憾,弄的我只能同时开启两个。

HttpAnalyzer:这个是用来抓包用的,无论什么包统统抓,不过只能抓Http协议的包,当年傻,分析飞信协议的时候,

                用这个抓,结果只抓了一点东西。如果你想抓取更底层的推荐一个:WireShark,免费的好用的。

MyEclipse:这个不多说了,弄过J2EE的应该都知道的。

另外就是第三Jar包了,HttpClient 4.01 请到:http://hc.apache.org/downloads.cgi 下载,只要是4版本上的都应该可以,如果是3.1版本的估计你要重新写一些代码,因为4较3还是有很大的改进的。

 

      一般来说,一个网站对访问它内部的东西需要权限的验证的,比如你下载某个网站的东西,他会提示说 只有会员才可以下载,于是乎,这里存在一个session,保存了你的登陆信息也就是你的访问网站内部资源的权限了。人人网估计也不是省油的灯(这里有问题,后面解释),于是我们应该登陆它才能获得访问它内部资源的权限。那么我们首先来抓包分析应该怎么用登陆,于是HttpAnalyzer闪亮登场.

打开HttpAnalyzer,让他开始工作,我们打开浏览器,输入renren.com。第一次咱先不急着登陆。我们随便输入一个账号密码看看:

 

 

 

      我们看到当你输入用户名密码后就将你输入的东西post到:http://www.renren.com/PLogin.do,

其中PostData有四个:email,password,origURL,domain。至于后面的数据是我们刚刚在登陆页面上填写的数据。

我们再来看看它登陆页面的源代码:

 

 

      注意我红色标注的地方:我们注意到,除了我们刚刚在上面发送的数据还有其他的隐藏发送的的东西:例如:origURL等等,这里他们是<input type="hidden" />,应该说在form里面的input都应该发送过去,但是这里他只发送了四个。

既然postdata只有那么四个参数,那我们就姑且只用那个四个东西好了。

所以我们用HttpClient构造请求的时候,就应该将这四个参数的给附带进去,部分代码如下:

// 将要发送的数据封包
  List<NameValuePair> params = new ArrayList<NameValuePair>();
  params.add(new BasicNameValuePair("email", this.email));
  params.add(new BasicNameValuePair("password", this.password));
  params.add(new BasicNameValuePair("origURL", origURL));
  params.add(new BasicNameValuePair("domain", domain));

 

接下来我们来完整登陆一次:

当输入正确的用户名密码,点击登陆,我们又获得什么样的东西呢?参见如下:

 

 

返回的内容意思大概是 地址转变了要进行跳转,而且返回的相应头是 302,文件修改了。再看一下 返回的消息头:

 

 

       有一个Location,应该是要我们跳转的地址。这样我们应该可以访问人人网的任意连接资源了。

 

登录过程的完整代码(包含读嗅探指定资源的链接):

 

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

/**
 * 
 * 
 * Author : Saitkey < lei_d@foxmail.com >
 */
public class RenRenNotify {
	private static HttpResponse response;
	private static DefaultHttpClient httpClient;

	public RenRenNotify(String userName, String password) {
		this.httpClient = new DefaultHttpClient();
		String loginForm = "http://www.renren.com/PLogin.do";
		String origURL = "http://www.renren.com/Home.do";
		String domain = "renren.com";
		// 在首页表单上是隐藏的 抓包后分析,并没有发送到服务器
		// String autoLogin = "true";
		// 构造一个POST请求,利用Httclient提供的包
		HttpPost httpPost = new HttpPost(loginForm);
		// 将要发送的数据封包
		List<NameValuePair> params = new ArrayList<NameValuePair>();
		params.add(new BasicNameValuePair("email", userName));
		params.add(new BasicNameValuePair("password", password));
		params.add(new BasicNameValuePair("origURL", origURL));
		params.add(new BasicNameValuePair("domain", domain));

		// 封包添加到Post请求
		try {
			httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		// 将 get 和post 方法包含到一个函数里面去,这里就是登陆过程了。
		response = postMethod(httpPost);
		/*
		 * 有跳转 System.out.println(response.getStatusLine());//返回302
		 * Header[]headers=response.getAllHeaders(); for (int i = 0; i <
		 * headers.length; i++) { Header header = headers[i];
		 * System.out.println(header.getName()+": "+header.getValue()); }
		 */
		// 读取跳转的地址
		// String redirectUrl = response.getFirstHeader("Location").getValue();
		// 查看一下跳转过后,都出现哪些内容.
		// response=getMethod(redirectUrl);//函数见后面
		// System.out.println(response.getStatusLine()); // HTTP/1.1 200 OK

		// 读取一下主页都有什么内容 已经登陆进去
		// System.out.println(readHtml("http://www.renren.com/home"));
	}

	// 嗅探指定页面的代码
	public String notify(String url) {
		HttpGet get = new HttpGet(url);
		ResponseHandler<String> responseHandler = new BasicResponseHandler();
		String txt = null;
		try {
			txt = httpClient.execute(get, responseHandler);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			get.abort();
		}
		return txt;
	}

	// 用post方法向服务器请求 并获得响应,因为post方法要封装参数,因此在函数外部封装好传参
	public HttpResponse postMethod(HttpPost post) {
		HttpResponse resp = null;
		try {
			resp = httpClient.execute(post);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			post.abort();
		}
		return resp;
	}

	// 用get方法向服务器请求 并获得响应
	public HttpResponse getMethod(String url) {
		HttpGet get = new HttpGet(url);
		HttpResponse resp = null;
		try {
			resp = httpClient.execute(get);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			get.abort();
		}
		return resp;
	}

	public static void main(String[] args) {
		RenRenNotify notify = new RenRenNotify("[你的用户名]",
				"[你的密码]");
		System.out.println(notify
				.notify("http://www.renren.com/home"));
	}

}

 

 

        好了,现在登录了。我们去修改自己的教育信息吧,首先自然是进入相应的页面:

 

       当我们进入了修改教育信息的时候,我们发现HttpAnalyzer里面多了如下内容:

 

 

 

   注意红色的内容。这里应该是所有高校的信息。体积也达到了402kb,看一下里面的内容:

 

 

 

        这个里面有个奇怪的东西:\u4e2d\u56fd 这个是 “中国”的意思,经过转码了。用JavaScript 直接 alert('u4e2d\u56fd '),就明了了。

        对于一长串的字符,可以用下面的代码进行回来(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)));
		}
		code = sb.toString();

 

 接下来,我们选择一个高校看看,HttpAnalyzer里面出现如下的信息:

 

 

 

 

再来一下:

 

 

 

 

       所以通过上面两次抓取,我们应该得出一个例子,那就是:我们选择好了一个大学,就会相应的得出他的ID,然后这时候会想服务器发送一个请求查询:http://www.renren.com/GetDep.do?id=13003 ,其中id后面的便是高校的代号了。然后返回的是一串html代码,如下:

 

 

 

         这里同样是奇怪的一串数字,这种也是Unicode,不过是十进制的,而且在编码的前后分别加上“&#”和“;”就可以形成Html实体字符,可以在网页上直接显示。

 

 

对于以上的代码,我们也参照上面写一个转换的代码:如下:

 

		StringBuffer sb=new StringBuffer(code);
		int pos;
		while ((pos=sb.indexOf("&#"))>-1) {
			String tmp=sb.substring(pos+2, pos+7);
			sb.replace(pos, pos+8, Character.toString((char)Integer.parseInt(tmp,10)));
		}
		code=sb.toString();

 

        写到这里,我们的工作也做了一大半了。于是乎,我这里不得不跟大家陈清一个事实,获得

http://s.xnimg.cn/a13819/allunivlist.js

http://www.renren.com/GetDep.do?id=13003

的页面代码,人人网是没有设置 session的权限认证的。直接可以读不信你可以点击上面的两个地址,你就发现,原来可以直接读取的。

 

       也就是说。我们可以另辟路径,不用通过HttpClient去登陆一下在取得数据,这一点很不好意思。我刚开始没有意识到。不过,这里你也还是学会了一种登陆一个服务器的办法,说不定以后你会用到呢。

 

 

好了,下面我们开始另一种方法。

       首先,我们对获取http://s.xnimg.cn/a13819/allunivlist.js的数据进行分析一下:

var allUnivList = [{"id":"00","univs":"","name":"\u4e2d\u56fd","provs":[{............."country_id":0,"name":"\u53f0\u6e7e"}]},{"id":"01","univs"...................

这样的数据类型。我想做过ajax的都知道是json类型的。 但是这里我要用Java的正则表达式进行解析。

 

首先分析数据结构:

[{国家:[{省市区[{高校S}],......}],....},....] 大概就是这样的结构 其中....表示可能有多个 同级机构。如 安徽省呵北京市, 而在北京市下有 清华大学和北京大学 是同级的。以此类推啦。

 

我只需要中国的的大学,所以我首先选出中国这块的数据:用到的正则表达式是:"\"provs\":(.*?)]}"

这里主要对比 在台湾省结束的时候,有]}标志,而且在前面并没有出现,而且用非贪婪模式去批判就能保证是中国的高校了。如图

 

 

取得了中国部分,接下来对中国的省市区进行解析了,同样,我们看到:

[{"id":"00",............"country_id":0,"name":"..........."},这样的结构

 

所以对每一个省我们可以分析到如下的正则表达式:id\":(.*?),\"univs\":(.*?),\"country_id\":0,\"name\":\"(.*?)\"}

       然后对 中国这部分进行一个循环,就可以得到中国所有的省市区了,同样我们对每一个省市,要对他们包含的高校进行选择:

 

       我们很容易就可以看到高校的 结构应该是:{"id":1001,"name":"\u6e05\u534e\u5927\u5b66"} 类似,那么正则表达式应该是:"id\":(.*?),\"name\":\"(.*?)\"";

 

       对于每一个高校,我们可以类似于省市那样处理,用循环匹配,就可以得到这个省市的所以高校。但是对于每一个高校。我们要还需要获得他的院系信息。前文跟大家分分析了,院系信息是通过http://www.renren.com/GetDep.do?id=xxxx来动态获取(xxx代表高校的编号),那么我们在抓取高校的时候,顺带也将他们的院系信息获取了。

写了这么多,咱直接上代码:

      你也可以选择下载下面的代码。里面有一些必要的文件已经jar包,需要自己配置一下。如果不会,请留言吧,我争取重新打包再上传上来。

 

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
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;

/**
 * 
 * 
 * Author : Saitkey < lei_d@foxmail.com >
 */
public class GenerateSQL {
	// 构建省的sql文件
	private File province = new File("provice.sql");
	// 构建高校的sql文件
	private File college = new File("college.sql");
	// 构建院系的sql文件
	private File department = new File("department.sql");

	GenerateSQL() 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);
		System.out.println("读取高校信息...");
		StringBuffer sb = new StringBuffer(client.execute(get, responseHandler));
		System.out.println("读取完成...");

		// 对获取的字符串进行处理截取从"provs":到}]},{"id":"01"部分
		String alluinvRegex = "\"provs\":(.*?)]}";
		Pattern pattern = Pattern.compile(alluinvRegex);
		String chn = "";
		Matcher matcher = pattern.matcher(sb.toString());
		matcher.find();
		chn = matcher.group(1);
		// System.out.println(convertFromHex(tmp));

		// 对截取的中国部分按照省市区进行匹配"id":1,"univs" ...... "country_id":0,"name":"台湾"
		String regex2 = "id\":(.*?),\"univs\":(.*?),\"country_id\":0,\"name\":\"(.*?)\"}";
		Pattern pattern2 = Pattern.compile(regex2);
		Matcher matcher2 = pattern2.matcher(chn);
		StringBuilder provsBuilder = new StringBuilder();
		StringBuilder colBuilder = new StringBuilder();
		StringBuilder deparBuilder = new StringBuilder();
		while (matcher2.find()) {
			// 我们项目的sql语句,如果你们数据库不一样,稍微修改一下拉
			provsBuilder.append("insert into province(PROID,PRONAME)values('"
					+ matcher2.group(1) + "','"
					+ convertFromHex(matcher2.group(3)) + "');\n");
			System.out.println("生成-" + convertFromHex(matcher2.group(3))
					+ "-数据库");
			// 取得学校的ID,还有名字 "id":1001,"name":"\u6e05\u534e\u5927\u5b66"
			String colRegex = "id\":(.*?),\"name\":\"(.*?)\"";
			Pattern colPattern = Pattern.compile(colRegex);
			Matcher colMatcher = colPattern.matcher(matcher2.group(2));
			while (colMatcher.find()) {
				colBuilder
						.append("insert into COLLEGE(PROID,COLID,COLNAME)values('"
								+ matcher2.group(1)
								+ "','"
								+ colMatcher.group(1)
								+ "','"
								+ convertFromHex(colMatcher.group(2)) + "');\n");

				System.out.println("生成-" + convertFromHex(colMatcher.group(2))
						+ "-数据库");

				get = new HttpGet(depUrl + colMatcher.group(1));
				ResponseHandler<String> depHandler = new BasicResponseHandler();
				generateDepartment(client.execute(get, depHandler), colMatcher
						.group(1), deparBuilder);
			}

		}
		PrintStream ps = new PrintStream(province);
		ps.print(provsBuilder.toString());
		ps.close();

		PrintStream ps2 = new PrintStream(college);
		ps2.print(colBuilder.toString());
		ps2.close();

		PrintStream ps3 = new PrintStream(department);
		ps3.print(deparBuilder.toString());
		ps3.close();
		System.err.println("\n\n\n完成数据库生成,请打开项目目录查看!");
	}

	// 这个函数用来处理行查询到的高校院系 <option
	// value='&#20013;&#22269;&#35821;&#35328;&#25991;&#23398;&#23398;&#38498;'>&#20013;&#22269;&#35821;&#35328;&#25991;&#23398;&#23398;&#38498;</option>
	public void generateDepartment(String src, String colid, StringBuilder sb) {
		String departRegex = "value='(.+?)'>";// 开始用这个正则表达式"value='(.*?)'>";
		// 后来发现有问题,问题你自己探索吧。
		Pattern pattern = Pattern.compile(departRegex);
		Matcher matcher = pattern.matcher(src);
		while (matcher.find()) {
			sb.append("insert into DEPARTMENT(COLID,DEPNAME)values('" + colid
					+ "','" + convertFromDec(matcher.group(1)) + "');\n");
		}
	}

	public static String convertDec(String src) {
		return Character.toString((char) Integer.parseInt(src, 10));
	}

	public static String convertHex(String src) {
		return Character
				.toString((char) Integer.parseInt(src.substring(2), 16));
	}

	// 转换&#xxxxx;形式Unicode
	private 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 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();
	}

	public static void main(String[] args) throws ClientProtocolException,
			IOException {
		new GenerateSQL();
	}
}

 

      写到这里,基本上完成了高校数据库的抓取工作,现在只需要导入刚刚生成的sql文件就可以了。如果你想抓取其他的信息。原理也应该差不多的吧。只不过要看看他们有没有设置session 的权限认证了。如果有,那你得写一个登陆的东西获得那认证,前面也写了差不多。应该可以看懂的。感谢你花这么长的时间。

       至于标题的 省 高校 院系级联,好吧, 我骗你了。只不过今天就到此了,还有Asp.net的任务。有了数据库了,咱还怕写不出来那个级联么?各位看官,如果你要什么好的级联,可以分享一下吧。

 

声明:抓取人人网数据仅供学习之用,不对人人网有任何恶意的行为。

  • 大小: 25.6 KB
  • 大小: 58.7 KB
  • 大小: 43.1 KB
  • 大小: 69.6 KB
  • 大小: 25.8 KB
  • 大小: 13.6 KB
  • 大小: 50.2 KB
  • 大小: 40.4 KB
  • 大小: 43.6 KB
  • 大小: 8.4 KB
  • 大小: 5.3 KB
分享到:
评论
54 楼 yang02301 2010-12-01  
satikey 写道
网友说,用HttpClient抓取腾讯微博的 数据很难,我想试试。哪些人报名,一起研究一下?


难点在于用JavaScript写的MD5代码太恶心了(在login_div.js文件中),在ajax_Submit()中生成Password代码段如下:

        if(E[A].name=="p"){
            alert(E.verifycode.value);
            alert(E.p.value)
            var F="";
            F+=E.verifycode.value;
            F=F.toUpperCase();
            B+=md5(md5_3(E.p.value)+F)
        }

E.p.value是实际口令,E.verifycode.value是返回的确认吗,4次使用MD5,
function md5_3(B){
    var A=new Array;

    A=core_md5(A,B.length*chrsz);
 
    A=core_md5(A,16*chrsz);
 
    A=core_md5(A,16*chrsz);
 
    return binl2hex(A);
}

请哪位将MD5翻译好的Java代码贴出来共享一下,谢谢!

53 楼 satikey 2010-12-01  
网友说,用HttpClient抓取腾讯微博的 数据很难,我想试试。哪些人报名,一起研究一下?
52 楼 satikey 2010-12-01  
yang02301 写道
satikey 写道
yang02301 写道
请教一下LZ:

RenRen网可以用附加的程序处理Login,
但是t.qq.com则是使用Get的方法,另附加Cookie,不知道LZ是如何处理的,请赐教。

多谢!


如果是GET方法,可以再后面添加参数例如
t.qq.com?username=xxx&password=xxx
大概这个样子的。你用网页登陆一下。注意浏览器的地址变化吧。
等我有时间了再弄腾讯微博吧。


针对 t.qq.com LOGON:

Step1):

sb = notify("http://ptlogin2.qq.com/check?uin=@hdrive20&appid=46000101&r=0.617148618189815");
System.out.println("Verify Code = '" + sb.substring(18, 22)+ "'");

返回验证码,如:

ptui_checkVC('0','!BMF');

ptui_checkVC存于login_div.js文件中。

问题出现:httpcomponents-client-4.0.3是否可以执行ptui_checkVC?如何执行?


Step2):得到验证码后,驶入口令,点“登录”见后,应该向browser发送get方法,如:
url = "http://ptlogin2.qq.com/login?u=@hdrive20&p=67E5A3B52AE29D6FC6FAFB1587F8D8F3&verifycode=" + sb.substring(18, 22) + "&low_login_enable=1&low_login_hour=720&aid=46000101&u1=http%3A%2F%2Ft.qq.com&ptredirect=1&h=1&from_ui=1&dumy=&fp=loginerroralert";
sb = notify(url);
System.out.println(sb);

返回:
ptuiCB('3','0','','0','您输入的密码有误,请重试。');

没有关系,注意参数‘p’是用户口令经过验证码处理后的数值,本人还不知道如何得到,所以返回错误。

请各位指教






这个还真有意思啊。。嘿嘿。改天有时间研究一下。。最近在弄别的东西了。。
51 楼 yang02301 2010-12-01  
现在的网站越来越复杂,集成的东西越来越多,有些事情httpunit是做不了的,

HttpClient is NOT a browser.
HttpClient's purpose is to transmit and receive HTTP messages.
HttpClient will not attempt to cache content, execute javascript embedded in HTML pages, try to guess content type, or reformat request / redirect location URIs, or other functionality unrelated to the HTTP transport.

如果需要模拟浏览器操作,该使用什么工具?

JWebUnit?

PHP - HttpUnit?

或者是其他的?
50 楼 yang02301 2010-12-01  
yang02301 写道
研究发现:

t.qq.com logon参数p在文件login_div.js中的 function ajax_Submit()实现,



        if(E[A].name=="p"){
            var F="";
            F+=E.verifycode.value;
            F=F.toUpperCase();
            B+=md5(md5_3(E.p.value)+F)
            }else{
            if(E[A].name=="u1"||E[A].name=="ep"){
                B+=encodeURIComponent(E[A].value)
                }else{
                B+=E[A].value
                }
            }
        B+="&"

B是Get方法要提交的url字符串,t.qq.com logon还泥马用到了MD5加密,
49 楼 yang02301 2010-12-01  
研究发现:

t.qq.com logon参数p在文件login_div.js中的 function ajax_Submit()实现,

48 楼 yang02301 2010-12-01  
satikey 写道
yang02301 写道
请教一下LZ:

RenRen网可以用附加的程序处理Login,
但是t.qq.com则是使用Get的方法,另附加Cookie,不知道LZ是如何处理的,请赐教。

多谢!


如果是GET方法,可以再后面添加参数例如
t.qq.com?username=xxx&password=xxx
大概这个样子的。你用网页登陆一下。注意浏览器的地址变化吧。
等我有时间了再弄腾讯微博吧。


针对 t.qq.com LOGON:

Step1):

sb = notify("http://ptlogin2.qq.com/check?uin=@hdrive20&appid=46000101&r=0.617148618189815");
System.out.println("Verify Code = '" + sb.substring(18, 22)+ "'");

返回验证码,如:

ptui_checkVC('0','!BMF');

ptui_checkVC存于login_div.js文件中。

问题出现:httpcomponents-client-4.0.3是否可以执行ptui_checkVC?如何执行?


Step2):得到验证码后,驶入口令,点“登录”见后,应该向browser发送get方法,如:
url = "http://ptlogin2.qq.com/login?u=@hdrive20&p=67E5A3B52AE29D6FC6FAFB1587F8D8F3&verifycode=" + sb.substring(18, 22) + "&low_login_enable=1&low_login_hour=720&aid=46000101&u1=http%3A%2F%2Ft.qq.com&ptredirect=1&h=1&from_ui=1&dumy=&fp=loginerroralert";
sb = notify(url);
System.out.println(sb);

返回:
ptuiCB('3','0','','0','您输入的密码有误,请重试。');

没有关系,注意参数‘p’是用户口令经过验证码处理后的数值,本人还不知道如何得到,所以返回错误。

请各位指教



47 楼 yang02301 2010-12-01  
LZ:

t.qq.com get login的方法不是那么简单,好像还有其它的花花肠子呢,比较有意思。

46 楼 satikey 2010-11-30  
yang02301 写道
请教一下LZ:

RenRen网可以用附加的程序处理Login,
但是t.qq.com则是使用Get的方法,另附加Cookie,不知道LZ是如何处理的,请赐教。

多谢!


如果是GET方法,可以再后面添加参数例如
t.qq.com?username=xxx&password=xxx
大概这个样子的。你用网页登陆一下。注意浏览器的地址变化吧。
等我有时间了再弄腾讯微博吧。
45 楼 yang02301 2010-11-30  
请教一下LZ:

RenRen网可以用附加的程序处理Login,
但是t.qq.com则是使用Get的方法,另附加Cookie,不知道LZ是如何处理的,请赐教。

多谢!
44 楼 fkpwolf 2010-11-29  
有点像网络蜘蛛啊,不过这东西google好像都用python之类的脚本语言,灵活。java搞这有点怪
43 楼 jiasky 2010-11-29  
楼主的“山寨”意识确实很强,开玩笑的,
这个应用可以拿来做个灌水机。
42 楼 xlyyc 2010-11-29  
satikey 写道
xlyyc 写道
首先,LZ作为学生,如此已经难能可贵,需要鼓励

其次,这些做法还是有点绕路,累了点。

JS注入+DOM是比较省事的做法



你说的是 跨域访问他 然后获得数据是吧。我有想过,但是我们项目可能只会在局域网里面跑,给老师检查后就不知道会不会维护了。我担心的是如果在局域网,要是不能连接到人人那里的话,那我们不就死定了,抓下来放在自己数据库以备不测。不过还是谢谢你的关注。



no,JS是注入的,和局域网没有关系
41 楼 lauphai 2010-11-29  
不错学习了
40 楼 satikey 2010-11-29  
xlyyc 写道
首先,LZ作为学生,如此已经难能可贵,需要鼓励

其次,这些做法还是有点绕路,累了点。

JS注入+DOM是比较省事的做法



你说的是 跨域访问他 然后获得数据是吧。我有想过,但是我们项目可能只会在局域网里面跑,给老师检查后就不知道会不会维护了。我担心的是如果在局域网,要是不能连接到人人那里的话,那我们不就死定了,抓下来放在自己数据库以备不测。不过还是谢谢你的关注。
39 楼 xlyyc 2010-11-29  
首先,LZ作为学生,如此已经难能可贵,需要鼓励

其次,这些做法还是有点绕路,累了点。

JS注入+DOM是比较省事的做法
38 楼 ap0406708 2010-11-29  
哈哈,不错!
37 楼 cn_arthurs 2010-11-29  
真的很不错,授人以渔
36 楼 satikey 2010-11-29  
vivid_gxp 写道
phenom 写道
数据是json,需要正则一个一个解析么?累人.


java 可以操作json,何必用正则表达式么?



下午的时候。我改进一下吧。用json。满足大家的要求好了。
35 楼 vivid_gxp 2010-11-29  
phenom 写道
数据是json,需要正则一个一个解析么?累人.


java 可以操作json,何必用正则表达式么?

相关推荐

    HttpClient抓取网页Demo

    在本文中,我们将深入探讨HttpClient的基本用法,以及如何使用它来抓取网页内容。 首先,你需要在项目中引入HttpClient的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org....

    java httpclient 抓取 数据 和jar 包

    在本篇文章中,我们将深入探讨如何使用Java HttpClient来抓取网页数据以及如何打包成jar文件。 **一、Java HttpClient简介** Java HttpClient 是 Apache HttpClient 库的一部分,它提供了丰富的功能,包括连接管理...

    httpClient+jsoup 抓取网页数据

    1. **HttpClient的使用**: - 创建HttpClient实例:首先,我们需要创建一个HttpClient对象,这通常是通过HttpClientBuilder或者HttpClientFactory完成的。 - 设置请求参数:然后,我们可以配置请求头、HTTP方法、...

    人人网高校信息库(json格式)

    你在做项目的过程中,是否遇到过要全国所有高校的信息库,包括院系学院?你想想,全国这么多高校,一个一个去调查,岂不是累死了。我们观察其他网站,比如renren.com网,它的高校信息就比较齐全,查看了相关代码后,...

    commons-httpclient-3.0.jar JAVA中使用HttpClient可以用到

    《JAVA中使用HttpClient:commons-httpclient-3.0.jar详解》 在JAVA开发中,进行HTTP请求时,Apache的HttpClient库是一个不可或缺的工具。本文将深入解析`commons-httpclient-3.0.jar`,它是HttpClient的一个重要...

    httpclient-4.5jar

    httpclient-4.5所需jar包,里面包含httpclient-4.5.jar等等10个必须的开发包。 1.commons-codec-1.9.jar 2.commons-logging-1.2.jar 3.fluent-hc-4.5.jar 4.httpclient-4.5.jar 5.httpclient-cache-4.5.jar 6....

    httpclient-4.5.6-API文档-中文版.zip

    赠送jar包:httpclient-4.5.6.jar; 赠送原API文档:httpclient-4.5.6-javadoc.jar; 赠送源代码:httpclient-4.5.6-sources.jar; 赠送Maven依赖信息文件:httpclient-4.5.6.pom; 包含翻译后的API文档:httpclient...

    httpClient+jsoup抓取网页数据实例和jar包

    以下是一个简单的示例,展示如何使用HttpClient获取网页内容,然后用Jsoup解析: ```java import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache....

    httpclient抓取网页数据和所需的10个jar包

    本篇文章将详细介绍如何使用HttpClient库抓取网页数据,并讨论与之相关的10个关键jar包。 HttpClient库提供了丰富的API,可以方便地执行GET、POST和其他HTTP方法,设置请求头,管理Cookie,处理重定向,以及进行...

    httpclient-4.5.13-API文档-中文版.zip

    赠送jar包:httpclient-4.5.13.jar; 赠送原API文档:httpclient-4.5.13-javadoc.jar; 赠送源代码:httpclient-4.5.13-sources.jar; 赠送Maven依赖信息文件:httpclient-4.5.13.pom; 包含翻译后的API文档:...

    C#版小偷工具 网上资源自动抓取并插入数据库源码

    本项目提供了一个C#版的小偷工具,它能够自动抓取网上资源并将其存储到数据库中,这对于开发者来说是很有价值的学习材料。下面我们将详细探讨这个工具的相关知识点。 1. **C#编程语言**: C#是微软公司推出的一种...

    HttpClient 登录163邮箱

    1. **HttpClient基本概念** HttpClient库提供了对HTTP协议的全面支持,包括各种HTTP方法(GET、POST、PUT等)、重定向处理、身份验证、cookie管理等。它的设计目标是为开发者提供一个强大、灵活且易于使用的HTTP...

    HttpClient网页抓取工具包整合

    HttpClient是Apache软件基金会的一个开源项目,它提供了一个强大的、高度可定制...通过提供的 httpClient网页抓取工具整合包,你可以快速地搭建起一个基本的网页抓取框架,进一步深入学习和实践HttpClient的各项功能。

    httpclient-4.5.5-API文档-中文版.zip

    赠送jar包:httpclient-4.5.5.jar; 赠送原API文档:httpclient-4.5.5-javadoc.jar; 赠送源代码:httpclient-4.5.5-sources.jar; 包含翻译后的API文档:httpclient-4.5.5-javadoc-API文档-中文(简体)版.zip ...

    httpclient-4.1-alpha1.jar

    httpclient-4.1-alpha1.jar httpclient-4.1-alpha1.jar httpclient-4.1-alpha1.jar httpclient-4.1-alpha1.jar httpclient-4.1-alpha1.jar

    httpclient-4.5.10-API文档-中文版.zip

    赠送jar包:httpclient-4.5.10.jar; 赠送原API文档:httpclient-4.5.10-javadoc.jar; 赠送源代码:httpclient-4.5.10-sources.jar; 赠送Maven依赖信息文件:httpclient-4.5.10.pom; 包含翻译后的API文档:...

    httpclient-4.3-beta1

    httpclient-4.3-beta1

    commons-httpclient-3.0.1--java网络开发

    // 2010-1-15 // -- implementation of methods is not available package org.apache.commons.httpclient; // Imports import java.io.IOException; import org.apache.commons.httpclient.params....

    httpcore-4.2.4,httpclient-4.2.5,httpclient-cache-4.2.5,httpmime-4.2.5的jar包下载

    HttpClient提供了丰富的功能,如支持认证、重定向、Cookie管理、请求和响应的处理,以及自定义请求头等。此外,HttpClient还支持异步操作,可以用于并发执行多个HTTP请求,这对于并发性能有较高要求的系统来说非常...

Global site tag (gtag.js) - Google Analytics