使用Jsoup对ASPX站点发送POST请求爬取时无法获取筛选后页面
解决Jsoup爬取筛选后页面失败的问题
嘿,我来帮你搞定这个头疼的问题!你现在用Jsoup只拿到默认页面,大概率是没处理好ASP.NET页面的表单提交逻辑,我给你一步步拆解解决办法:
别用
get(),改用post()提交表单
你当前的代码用的是.get(),但这类带筛选器的ASP.NET页面,筛选操作几乎都是通过POST请求提交表单参数的,默认页面是GET加载的,所以直接get()肯定拿不到筛选后的内容。必须带上ASP.NET的隐藏字段
ASP.NET页面会生成几个关键的隐藏字段(比如__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION),这些字段是服务器验证请求合法性的关键,必须从初始页面提取后,在POST请求里一起提交。先写获取初始页面和隐藏字段的代码:
// 先请求初始页面,拿到必要的隐藏字段和Cookie Connection.Response initialResponse = Jsoup.connect("http://45.114.246.184/bsmm/Dashboards/DB.aspx") .timeout(50*1000) .execute(); Document doc = initialResponse.parse(); // 提取ASP.NET的核心隐藏字段(注意选择器要和页面实际的ID匹配) String viewState = doc.select("#__VIEWSTATE").val(); String viewStateGenerator = doc.select("#__VIEWSTATEGENERATOR").val(); String eventValidation = doc.select("#__EVENTVALIDATION").val();构造POST请求,带上筛选参数和所有必要字段
接下来要把筛选器对应的表单参数(比如下拉框、复选框的name和选中值)和上面的隐藏字段一起提交,还要带上初始请求的Cookie保持会话:// 构造POST请求,替换成你实际的筛选控件参数 Document filteredDoc = Jsoup.connect("http://45.114.246.184/bsmm/Dashboards/DB.aspx") .cookies(initialResponse.cookies()) // 带上会话Cookie .data("__VIEWSTATE", viewState) .data("__VIEWSTATEGENERATOR", viewStateGenerator) .data("__EVENTVALIDATION", eventValidation) .data("你的筛选控件name", "选中的目标值") // 比如筛选下拉框name是ddlCategory,值是"2" // 如果有其他提交按钮的参数,比如btnSubmit的name和值也要带上 .data("btnSubmit", "筛选") .post();关键:用浏览器开发者工具抓真实的提交参数
如果你不确定筛选器对应的表单参数是什么,打开浏览器F12,进入「网络」标签,手动操作筛选器提交,找到对应的POST请求,查看「表单数据」里的所有键值对,把这些全部加到Jsoup的.data()里,一个都不能少!
内容的提问来源于stack exchange,提问作者Sushmitha
相关产品推荐
相关产品推荐

