基于JavaScript登录表单的网页爬取问题咨询
ASP.NET表单POST登录爬取问题解决思路
问题描述
我是网页爬取新手,多方查找仍无法解决对表单发送POST请求以实现成功登录的问题。据我了解,该表单使用JavaScript生成部分值发送至服务器验证,同时还通过按钮点击填充EVENTTARGET和EVENTARGUMENT变量?恳请有时间的人士帮忙查看以下表单代码并提供解决思路,谢谢。
目标表单代码
<form method="post" action="./" id="form1"> <div class="aspNetHidden"> <input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value=""> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMjgwNDU0NDQzD2QWAmYPZBYCAgMPZBYCAgEPZBYGZg8WAh4HVmlzaWJsZWcWCgIBDxYCHgNzcmMFQS9nbG9iYWwvaW1hZ2VzL2ludHJhbmV0L1BhZ2luYUluaWNpYWwvaTFfYmFycmFfdG9wb19pc2VwXzIwMjMucG5nZAIDDxYCHwEFOy9nbG9iYWwvaW1hZ2VzL2ludHJhbmV0L1BhZ2luYUluaWNpYWwvaTNfbG9nb19pc2VwXzIwMjMucG5nZAIFD2QWCAIBDxYCHwEFOy9nbG9iYWwvaW1hZ2VzL2ludHJhbmV0L1BhZ2luYUluaWNpYWwvaTJfYmVtLXZpbmRvXzIwMjEuanBnZAIDDw8WBB4IQ3NzQ2xhc3MFB1RleHRCb3geBF8hU0ICAmRkAgUPDxYEHwIFB1RleHRCb3gfAwICZGQCCw8WAh8AZ2QCBw8WAh8BBT8vZ2xvYmFsL2ltYWdlcy9pbnRyYW5ldC9QYWdpbmFJbmljaWFsL2k0X3NlbG9fZW50cmFkYXNfMjAyMi5wbmdkAgkPFgIfAQVCL2dsb2JhbC9pbWFnZXMvaW50cmFuZXQvUGFnaW5hSW5pY2lhbC9pNV9iYXJyYV9mdW5kb19pc2VwXzIwMjMucG5nZAIBDxYCHwBoZAICDxYCHwBoZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAQUoY3RsMDAkQ29udGVudFBsYWNlSG9sZGVyTWFpbiRidExvZ2luSVNFUA+aG0Q0q+ieRovqjfaBebNigtc2xzOPJmX7ygQS4ljU"> </div> <script type="text/javascript"> //<![CDATA[ var theForm = document.forms['form1']; if (!theForm) { theForm = document.form1; } function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } //]]> </script>
解决思路
1. 识别ASP.NET表单核心参数
这是典型的ASP.NET WebForms表单,必须携带以下关键隐藏参数才能通过验证:
__VIEWSTATE:服务器生成的状态值,每次请求都会更新,必须从当前页面的HTML中提取最新值__LASTFOCUS:通常可以留空,或者原样提交页面中的值__EVENTTARGET和__EVENTARGUMENT:由__doPostBack函数填充,对应触发提交的控件ID和参数,需要确定登录按钮对应的这两个值
2. 获取动态参数的方法
- __VIEWSTATE:发送GET请求到登录页面,解析响应HTML,提取
input[name="__VIEWSTATE"]的value属性值 - __EVENTTARGET/__EVENTARGUMENT:
- 查看登录按钮的HTML代码,通常按钮会绑定
onclick="__doPostBack('控件ID','')",其中第一个参数就是__EVENTTARGET的值,第二个是__EVENTARGUMENT - 如果找不到按钮的绑定代码,可以打开浏览器开发者工具,点击登录按钮时观察Network面板中POST请求的Form Data,直接获取这两个参数的值
- 查看登录按钮的HTML代码,通常按钮会绑定
3. 构造POST请求
- 请求URL:表单的
action属性值(这里是./,即当前页面URL) - 请求方法:POST
- 请求头:必须包含
Content-Type: application/x-www-form-urlencoded,同时要带上浏览器的User-Agent、Cookie等(如果页面有会话Cookie,需要先保存GET请求返回的Cookie) - Form Data:将提取到的
__VIEWSTATE、__LASTFOCUS、__EVENTTARGET、__EVENTARGUMENT,加上用户名、密码等登录字段,拼接成URL编码的键值对
4. 处理可能的额外验证
- 有些ASP.NET站点还会有
__VIEWSTATEGENERATOR、__EVENTVALIDATION等参数,同样需要从页面HTML中提取 - 如果登录过程中有JavaScript生成的其他参数(比如验证码、签名),需要分析对应的JS代码,模拟生成逻辑,或者使用Selenium等工具直接模拟浏览器操作
内容的提问来源于stack exchange,提问作者StaticP
相关产品推荐
相关产品推荐

