[爬虫踩坑]ASP.NET网页上的ViewState和EVENTVALIDATION(还有应对的翻页顺序)

[爬虫踩坑]ASP.NET网页上的ViewState和EVENTVALIDATION(还有应对的翻页顺序),第1张

最近在爬一个叫做"雅学资讯网"的网站的时候,在翻页的时候发现翻不动,做翻页请求时会报错。仔细查了以下发现跟ViewState和EVENTVALIDATION两个东西有关。(两个值的具体用法我写在最后,如果光为了解决爬虫问题可能不需要对这两个值有太深的理解,所以我先写下爬虫应该如何应对)

页面上我们可以找到这么一段div,其中value的值便是当前页面的ViewState

下面这一段是EVENTVALIDATION的

简单来说我们把这个页面的html解析获取这两个值,然后在执行post请求时加到PostData属性里就可以了。
但是
在翻页的时候可能还会有一个坑,我们有时会需要子页面中的内容。这个时候子页面爬取的顺序就有点讲究了。
正确顺序在第三部分,不需要看我踩坑过程的直接看第三部分。

如果我们按照下图这样的顺序,会发现我们在第一页子页c跳转到第二页的时候会失败。

按照本身应该的一页跳二页,二页跳三页的顺序爬取(先不管子页面),再爬每一页时存储好该页的Html或者跳转子页面的信息,先把所有父页面爬好,再根据本地的信息爬所有子页面。

当请求某个页面时,ASPNET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASPNET分析回传的窗体属性,并赋给控件对应的值。

“id”属性为“__EVENTVALIDATION”的隐藏字段是ASPNET 20的新增的安全措施。该功能可以阻止由潜在的恶意用户从浏览器端发送的未经授权的请求
为了确保每个回发和回调事件来自于所期望的用户界面元素,ASPNET运行库将在事件中添加额外的验证层。服务器端通过检验表单提交请求的内容,将其与“id”属性为“__EVENTVALIDATION”隐藏字段中的信息进行匹配。根据匹配结果来验证未在浏览器端添加额外的输入字段(有可能为用户在浏览器端恶意添加的字段),并且该值是在服务器已知的列表中选择的。ASPNET运行库将在生成期间创建事件验证字段,而这是最不可能获取该信息的时刻。像视图状态一样,事件验证字段包含散列值以防止发生浏览器端篡改。

Ajax 技术是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,在这种技术的情况下,虽然网页的地址没有变化,但并不代表客户端与服务器没有进行数据的请求与接收。

对于此类网页,如果想要采集数据,通常需要找到 ajax 向服务器发送的数据请求 url,比如,如下的 ajax 请求数据的代码(JQuery):

//ajax 带参数请求数据  
 $(function () {  
     $("#btnName")click(function () {  
         var strname = $("#txtName")val();     
         $ajax({  
             type: "post",   
             contentType: "application/json",         
             url: "demoaspx/getName",  //ajax访问的网址 
             data: "{strName:'" + strname + "'}", 
             contentType: "application/json",       
             success: function (result) {      
                 alert(resultd);          
             }  
         })  
     })  
 });

其中的 url 就是采集时的地址,而 data 就是返回值(通常为 JSON 格式)。

要找到 ajax 这些 url ,可以查看网页源代码(ajax 代码通常会写在客户端),也可以直接用网络监控工具,如 chrome 中的“开发者工具”,查看发送的各种请求。

分页显示,每次的翻页都是一个重新查询,通常各大网站里用到这个功能时,翻页时chieckbox选中状态都是不保存的,如果你硬要保存,就把选中的那些条记录保存再cookie或者session中(如果使用session将消耗大量服务器资源实不可取),每次翻页先从cookie中查找,根据cookie中的记录来选中chieckbox。
通常是没有必要去作这个功能的,每次翻页重新选chieckbox就行。

翻页前把该页每条记录的ID和checkbox值放到二维数组里,然后记录在session中,翻页后就先读取session,看看当前显示的记录中是否有ID在session的数组中,如果有就改变checkbox的值。
这样做要是翻页多了,session会很长,影响性能,不过这也没办法,可以适当限制保存数组的长度,超过了就从开始位置覆盖。每次翻页都要拼接数组哦,不要覆盖了,还要注意同一个ID的checkbox变化了之后要及时更新数组


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13431752.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-04
下一篇 2023-08-04

发表评论

登录后才能评论

评论列表(0条)

保存