APP下载

ViewState在ASP.NET网页抓取中的应用

2017-05-30申圣兵刘家乐

科技风 2017年3期

申圣兵 刘家乐

摘 要:本文主要介绍_ViewState属性值的动态获取方法,并通过教师课程表介绍它在ASP.NET网页抓取中的应用方法及注意事项。

关键词:ViewState;网页抓取;教师课程表

在Asp.net中,如果一个Web窗体控件设置了runat=”server”,这个控件会被附加一个隐藏的属性_ViewState,_ViewState存放了所有控件在ViewState中的状态值,这个值在网页抓取分析并利用相关参数进行模拟发送请求时是必不可少的,这个值在有些页面取值相对固定,所以有些网页抓取程序直接使用固定值,但更多的情况下,这个值需要动态获取。

下面以获取教师课表信息为例,介绍如何动态获取这个值和使用它。

如果直接抓取当前页面,得不到任何有用信息,因为它是通过多次回传来完成的。先选择“学年”,才会出现系部名称信息,选择不同的系部,后面的教师信息也会发生改变,只有这些信息都选好后,点击查询,才能得到相应教师的课表信息。

整个过程需要多次模拟网页发送,网页源码中的_ViewState值也多次会发生改变,如何获取这些_ViewState的值和使用它们,成为成功获取教师课表信息的关键。

具体步骤如下:

(1)设置该属性的标记字符串

private static String viewStateFlag="name=\"__VIEWSTATE\" value=\"";

(2)设计获取属性值的函数

public static String getViewState(String strResult) {

//strResult為网页源码

int len1 = strResult.indexOf(viewStateFlag) + viewStateFlag.length();

int len2 = strResult.indexOf("\"", len1);

vs = new String(strResult.substring(len1, len2));

return vs;

}

(3)使用用户的登陆信息,再调用HttpClient类的get方法模拟网页以get方法提交参数来获取第一次的_ViewState值vs1。

httpClient.get(url, params1, new AsyncHttpResponseHandler() )

//url:访问的网址,params1:相关参数,AsyncHttpResponseHandler:返回的相关信息成功后,再调用getViewState函数得到值vs1。

vs1=getViewState(strResult) //strResult为返回成功的网页源码

(4)经过第一次get方法模拟提交网页信息后,就可以得到网页课表的学年信息,如2015-2016等。

(5)选择学年及学期后,再将相关参数与vs1一起进行封装,模拟post方法提交网页信息,得到第二次的_ViewState值vs2。

httpClient.post(url, params2, new AsyncHttpResponseHandler() )

(6)成功后就可以得到学院的系部信。

(7)由于选择不同的系部,页面会再一次进行刷新,得到不同的教师列表信息,_ViewState的值也会发生改变,所以还要继续获取新的_ViewState的值。由于这一次提交的参数包含有中文信息,所以参数的封装也有一些变化,需要提交的参数封装后还需要重新编码。

HttpEntity entity=new UrlEncodedFormEntity(params,"gb2312");

提交的方式也与前面的有所不同。

httpClient.post(TCourseQueryActivity.this, urlTCourse, entity, "application / x-www-form-urlencoded;charset=gb2312", new AsyncHttpResponseHandler())

成功后,再调用getViewState函数得到值vs3。

vs3=getViewState(strResult) //strResult为返回成功的网页源码

(8)最后,再将vs3与其他的参数一起进行封装,就可以得到真实的课表信息了。

结语

_ViewState虽然是一个隐藏的区域,但是它在网页抓取的过程中是一个非常重要的参数,有些页面需要经过多次提交回传才能得到最终需要的数据信息,它的获取相对复杂,本文提到的抓取教师课表就经过了三次获取_ViewState的值的过程,初始_ViewState的值vs1,选择年份之后的_ViewState值vs2,选择教师之后的_ViewState值vs3,最终获取到教师课表信息。所以,熟练掌握_ViewState值的获取方法是成功抓取.net网页数据非常重要的一环。

参考文献:

[1] 莫学值.试析视图状态(ViewState)在ASP.NET中的应用.广西教育学院学报,2009,03.

[2] 杨敏.关于Asp.net中static与ViewState使用的探讨.吉林广播电视大学学报,2010,09.

[3] 翁岩青.网页抓取策略研究.哈尔滨工程大学,2010.