用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.imsuzie.com/%E5%A6%82%E4%BD%95%E6%8A%93%E5%8E%9F%E5%88%9B%E6%95%99%E5%8A%A1%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AF%BE%E8%A1%A8/

里面有链接是关于这几个参数的说明链接在这里

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一次!

哎。。。地址地址真的很容易弄错呀!下次一定要注意!多多理解!要学的还有很多!加油!耗子你一定行的!

原文地址:https://www.cnblogs.com/iMouseWu/p/3134760.html