最近在爬一个叫做"雅学资讯网"的网站的时候,在翻页的时候发现翻不动,做翻页请求时会报错。仔细查了以下发现跟ViewState和EVENTVALIDATION两个东西有关。(两个值的具体用法我写在最后,如果光为了解决爬虫问题可能不需要对这两个值有太深的理解,所以我先写下爬虫应该如何应对)
在页面上我们可以找到这么一段div,其中value的值便是当前页面的ViewState
下面这一段是EVENTVALIDATION的
简单来说我们把这个页面的html解析获取这两个值,然后在执行post请求时加到PostData属性里就可以了。 但是 在翻页的时候可能还会有一个坑,我们有时会需要子页面中的内容。这个时候子页面爬取的顺序就有点讲究了。 正确顺序在第三部分,不需要看我踩坑过程的直接看第三部分。
如果我们按照下图这样的顺序,会发现我们在第一页子页c跳转到第二页的时候会失败。
按照本身应该的一页跳二页,二页跳三页的顺序爬取(先不管子页面),再爬每一页时存储好该页的Html或者跳转子页面的信息,先把所有父页面爬好,再根据本地的信息爬所有子页面。
当请求某个页面时,把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,分析回传的窗体属性,并赋给控件对应的值。
“id”属性为“__EVENTVALIDATION”的隐藏字段是 的新增的安全措施。该功能可以阻止由潜在的恶意用户从浏览器端发送的未经授权的请求. 为了确保每个回发和回调事件来自于所期望的用户界面元素,运行库将在事件中添加额外的验证层。服务器端通过检验表单提交请求的内容,将其与“id”属性为“__EVENTVALIDATION”隐藏字段中的信息进行匹配。根据匹配结果来验证未在浏览器端添加额外的输入字段(有可能为用户在浏览器端恶意添加的字段),并且该值是在服务器已知的列表中选择的。运行库将在生成期间创建事件验证字段,而这是最不可能获取该信息的时刻。像视图状态一样,事件验证字段包含散列值以防止发生浏览器端篡改。