用java抓取网页信息!
最近因为需要,所以稍微了解了下用java抓取网页信息!
这次我所分配的任务是抓取原创上面的学生期末的排考!因为这个网页都是用asp.net写的,所以对里面的一些细节不是很了解!所以也只知道一个大概!因为自己毕竟不是搞asp的.
现在我们就来了解下详细的步骤吧!
其中基本上每个页面都会涉及到,Cookie这个值!而这个值里面又是怪怪的!由于我对asp的seesion和cookie了解的很不透彻所以去查了下资料!http://www.111cn.net/net/120/42672.htm
主要内容大概是这样Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。
这个cookie里面放的seesion的sessionid的值。而这个值就是用户在登陆的时候生成的!所以我们必须模拟登陆,然后抓取这个值!
现在来解释下模拟登陆所遇到的问题!首先我们自己得自己登陆一遍观察下在登陆界面需要传哪些值过去!这里用了post来提交数据!所以我们登陆以后,打开Google浏览器的审查元素。
在这里我们看到了我们想要的信息!
前面三个变量不是很懂,所以去看了下大黄(一个同学,同样是精弘。我的一个目标!)用PHP抓取原创课表的blog
里面有链接是关于这几个参数的说明链接在这里
http://blog.csdn.net/Terry001/article/details/2615965
Cbo_LX这个就前页选的“学生”了!
Txt_UserName和Txt_Password就是你前台传过去的用户名和密码了!
而Img_DL.x和Img_DL.y应该就是你点击按钮的时候的坐标了!这个不怎么有用!
现在问题又来了!。。这里涉及到中文了!那么会不会发现传过去编码和解码发生错误呢!。。经过试验果然是如此!直接传的话果然不能传到相应的页面!
在这个问题上面纠结了好久!然后开始试验不同的编码格式来改变"学生"。。。最后问题没有解决,反而引起了我对编码和解码的强烈的好奇!所以以后的日子会对着方面多多关注!下次准备花一个礼拜去研究下这个!由于上次发了blog说要搞流!但是实在是太忙了也没有搞!最后不得以删除了这个微博!所以下次有时间的话一起把这两个一起搞完!
最后请求了一位同学的帮助才得以解决这个问题!原来这里是要设置头文件的!
这里的Content-Type,这样子就OK了!
还要注意的就是,在前面提到的__viewstate这个参数,这个是会变的。也就是说每次登陆都是不一样的!这个不懂,所以去查了下资料http://zhidao.baidu.com/question/17929267.html
意思就是说这个值是会根据控件状态,而改变的!所以不同的用户登陆是不一样的!所以我们得去截取这个值!在每次请求得到页面以后去获取页面的这个hidden的值!再当做参数传到下一个请求页面。
最后说一个很蛋疼的东西!根据页面的步骤一步一步模拟!最后发现,中间的一些页面根本就不需要去模拟!。。。好吧!我弱智了!但是其中的收获还是蛮大的!
最后的就是得到数据以后的。转换下一个!因为我获取的是String的数据,所以必须转化成json格式的!所以又开始苦逼的生涯了!由于对json一窍不通,但是最后根据demo还是被我鼓捣出来了!目前总结下json map添加的键值对,就分别对应一个对象和对象名字!如果map的值是数组的话那么这个在json里面对应的就是数组!如果用的是bean的方式的,那么就相当于一个对象中,里面有很多属性!最后上级的要求就是这个格式的!。。。可能是我的代码不怎么好!所以导致我用前面2种方法的时候!逻辑有点乱!
代码先传到百度云盘上。需要的朋友可以去下来看看!
好了今天就写到这里吧!。。
//小道消息
报个料。。今天小白真的又当了回小白了
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; public class TestString { public static void main(String[] args){ Map map = new HashMap(); List list = new ArrayList(); String[] a = new String[3]; a[0]="0"; a[1]="1"; a[2]="2"; map.put("2", a); for(int i=0;i<a.length;i++){ System.out.println(a[i]); } a[0]="a"; a[1]="b"; a[2]="c"; map.put("4", a); for(int i=0;i<a.length;i++){ System.out.println(a[i]); } list.add(map); JSONArray jsonArray2= JSONArray.fromObject( list ); System.out.println( jsonArray2 ); } }
这样最后输出的结果会是{a,b,c},{a,b,c}请教下!又把忘记了地址这回事了!哎。。。这里map.put里面放进去的值是a的地址!后面a的值改变所以map中a所指向的值也会跟着改变。。解决办法就是在第二次赋值之前重新给a,new一次!
哎。。。地址地址真的很容易弄错呀!下次一定要注意!多多理解!要学的还有很多!加油!耗子你一定行的!