日期:2014-05-16  浏览次数:20475 次

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

?? ? ? 更新备注:将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.ClientProto