用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构造请求的时候,就应该将这四个参数的给附带进去,部分代码如下:
?
返回的内容意思大概是 地址转变了要进行跳转,而且返回的相应头是 302,文件修改了。再看一下 返回的消息头:
?
?
?? ? ? 有一个Location,应该是要我们跳转的地址。这样我们应该可以访问人人网的任意连接资源了。
?
登录过程的完整代码(包含读嗅探指定资源的链接):
?
?
?
?? 注意红色的内容。这里应该是所有高校的信息。体积也达到了402kb,看一下里面的内容:
?
?
?
?? ? ? ?这个里面有个奇怪的东西:\u4e2d\u56fd 这个是 “中国”的意思,经过转码了。用JavaScript 直接 alert('u4e2d\u56fd '),就明了了。
?? ? ? ?对于一长串的字符,可以用下面的代码进行回来(code是源):
?
?
?
?
再来一下:
?
?
?
?
?? ? ? 所以通过上面两次抓取,我们应该得出一个例子,那就是:我们选择好了一个大学,就会相应的得出他的ID,然后这时候会想服务器发送一个请求查询:http://www.renren.com/GetDep.do?id=13003?,其中id后面的便是高校的代号了。然后返回的是一串html代码,如下:
?
?
?
?? ? ? ? 这里同样是奇怪的一串数字,这种也是Unicode,不过是十进制的,而且在编码的前后分别加上“&#”和“;”就可以形成Html实体字符,可以在网页上直接显示。
?
?
对于以上的代码,我们也参照上面写一个转换的代码:如下:
?
?
取得了中国部分,接下来对中国的省市区进行解析了,同样,我们看到:
[{"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包,需要自己配置一下。如果不会,请留言吧,我争取重新打包再上传上来。
?
?
?? ? ?写到这里,基本上完成了高校数据库的抓取工作,现在只需要导入刚刚生成的sql文件就可以了。如果你想抓取其他的信息。原理也应该差不多的吧。只不过要看看他们有没有设置session 的权限认证了。如果有,那你得写一个登陆的东西获得那认证,前面也写了差不多。应该可以看懂的。感谢你花这么长的时间。
?????? 至于标题的 省 高校 院系级联,好吧, 我骗你了。只不过今天就到此了,还有Asp.net的任务。有了数据库了,咱还怕写不出来那个级联么?各位看官,如果你要什么好的级联,可以分享一下吧。
?
声明:抓取人人网数据仅供学习之用,不对人人网有任何恶意的行为。
返回验证码,如:
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’是用户口令经过验证码处理后的数值,本人还不知道如何得到,所以返回错误。
请各位指教
这个还真有意思啊。。嘿嘿。改天有时间研究一下。。最近在弄别的东西了。。
厉害,获取高校院系的那部分就很简单了。恩。基本上就是get post请求了。中国所有城市:===========北京 东城区 东城区 西城区 西城区 崇文区 崇文区 宣武区 宣武区 朝阳区 朝阳区 丰台区 丰台区 石景山区 石景山区 海淀区 海淀区 门头沟区 门头沟区 房山区 房山区 通州区 通州区 顺义区 顺义区 昌平区 昌平区 大兴区 大兴区 怀柔区 怀柔区 平谷区 平谷区 密云县 密云县 延庆县 延庆县天津 和平区 和平区 河东区 河东区 河西区 河西区 南开区 南开区 河北区 河北区 红桥区 红桥区 塘沽区 塘沽区 汉沽区 汉沽区 大港区 大港区 东丽区 东丽区 西青区 西青区 津南区 津南区 北辰区 北辰区 武清区 武清区 宝坻区 宝坻区 宁河县 宁河县 静海县 静海县 蓟县 蓟县河北 石家庄 长安区 桥东区 桥西区 新华区 井陉矿区 裕华区 井陉县 正定县 栾城县 行唐县 灵寿县 高邑县 深泽县 赞皇县 无极县 平山县 元氏县 赵县 辛集市 藁城市 晋州市 新乐市 鹿泉市 唐山 路南区 路北区 古冶区 开平区 丰南区 丰润区 滦县 滦南县 乐亭县 迁西县 玉田县 唐海县 遵化市 迁安市 秦皇岛 海港区 山海关区 北戴河区 青龙满族自治县 昌黎县 抚宁县 卢龙县 邯郸 邯山区 丛台区 复兴区 峰峰矿区 邯郸县 临漳县 成安县 大名县 涉县 磁县 肥乡县 永年县 邱县 鸡泽县 广平县 馆陶县 魏县 曲周县 武安市 邢台 桥东区 桥西区 邢台县 临城县 内丘县 柏乡县 隆尧县 任县 南和县 宁晋县 巨鹿县 新河县 广宗县 平乡县 威县 清河县 临西县 南宫市 沙河市 保定 新市区 北市区 南市区 满城县 清苑县 涞水县 阜平县 徐水县 定兴县 唐县 高阳县 容城县 涞源县 望都县 安新县 易县 曲阳县 蠡县 顺平县 博野县 雄县 涿州市 定州市 安国市 高碑店市 张家口 桥东区 桥西区 宣化区 下花园区 宣化县 张北县 康保县 沽源县 尚义县 蔚县 阳原县 怀安县 万全县 怀来县 涿鹿县 赤城县 崇礼县 承德 双桥区 双滦区 鹰手营子矿区 承德县 兴隆县 平泉县 滦平县 隆化县 丰宁满族自治县 宽城满族自治县 围场满族蒙古族自治县
64 楼 yang02301 2010-12-05
上传中国和世界大学院校列表(数据取自qq微薄)
上传中国大学院校所含院系列表(数据取自qq微薄) 65 楼 satikey 2010-12-05 yang02301 写道
上传中国和世界大学院校列表(数据取自qq微薄)
上传中国大学院校所含院系列表(数据取自qq微薄)
呵呵。那我做第一个下载的观众了。 66 楼 yang02301 2010-12-05 satikey 写道yang02301 写道
上传中国和世界大学院校列表(数据取自qq微薄)
上传中国大学院校所含院系列表(数据取自qq微薄)
呵呵。那我做第一个下载的观众了。
不知道大家还有什么资料需要从网上搜刮的,先提出来,看看我能否做到.
67 楼 guimingyue 2011-01-01 杯具呀!直接,用楼主的代码,然后用Hibernate插入到数据库,College的主键是autoincrement的,看着只有3000多个数据,然后看看楼主代码中生成的sql中,有3W多,以为生成的有错误,搞了半天,现在发现,楼主代码生成的sql中竟然数字是断断续续的....怪自己.... 68 楼 pywepe 2011-06-18 firebug 69 楼 Javaloverlover 2011-09-28 不错不错,学习了 70 楼 nocb 2011-10-13 看完了所有的回复,感觉楼主还是比较谦虚的 ,
有所得 谢谢!