使用JSoup调用POST方法提取Modem雷达无线信号,扫描按钮点击失败
解决JSoup无法触发Modem扫描按钮的问题
嘿,我遇到过类似的Modem管理页面爬取问题,JSoup本身是静态HTML解析库,没法直接触发JavaScript事件——这就是你点不了扫描按钮的核心原因!别慌,咱们换个思路,直接模拟按钮点击背后的实际请求就行,步骤如下:
第一步:分析扫描按钮的实际行为
先打开浏览器开发者工具(按F12),切换到Network标签,然后手动点击扫描按钮,观察浏览器发送的请求:
- 记录请求的URL、请求方法(GET/POST)
- 查看请求头(比如是否需要特定的
Referer或X-Requested-With) - 检查请求参数(比如是否有
csrf_token、action=scan这类字段)
第二步:用JSoup模拟扫描请求
JSoup可以通过Connection对象模拟发送这些请求,而且要带上登录后的Cookie保持会话(这一步你已经搞定登录,所以直接复用登录后的Cookie即可)。
示例1:如果扫描是表单提交
假设按钮属于一个表单,HTML结构类似:
<form id="scanForm" action="/cgi-bin/wifi_scan.cgi" method="POST"> <input type="hidden" name="csrf_token" value="abc123"> <button type="submit" id="scanBtn">扫描</button> </form>
对应的Java代码:
// 保存登录后的Cookie(你之前登录代码里应该已经拿到了) Map<String, String> loginCookies = loginResponse.cookies(); // 模拟提交扫描表单 Connection scanConn = Jsoup.connect("http://你的ModemIP/cgi-bin/wifi_scan.cgi") .cookies(loginCookies) .method(Connection.Method.POST) .data("csrf_token", "abc123"); // 从页面中提取实际的csrf值 // 发送扫描请求 scanConn.execute();
示例2:如果扫描是AJAX请求
如果按钮点击触发的是JavaScript发送的AJAX请求,比如:
function startScan() { fetch('/api/wifi/scan', { method: 'POST', headers: { 'X-CSRF-Token': 'abc123', 'Content-Type': 'application/json' }, body: JSON.stringify({action: 'start_scan'}) }); }
对应的Java代码:
Map<String, String> loginCookies = loginResponse.cookies(); // 模拟AJAX扫描请求 Connection scanConn = Jsoup.connect("http://你的ModemIP/api/wifi/scan") .cookies(loginCookies) .method(Connection.Method.POST) .header("X-CSRF-Token", "abc123") .header("Content-Type", "application/json") .requestBody("{\"action\": \"start_scan\"}"); scanConn.execute();
第三步:等待扫描完成并获取结果
扫描需要至少5秒,所以发送请求后要等待,然后再请求结果页面:
// 等待5秒(可以根据实际情况调整) Thread.sleep(5000); // 获取扫描结果页面 Document resultDoc = Jsoup.connect("http://你的ModemIP/wifi_survey_results") .cookies(loginCookies) .get(); // 解析附近的无线网络列表 Elements networkRows = resultDoc.select("table.wifi-networks tr:not(:first-child)"); for (Element row : networkRows) { String ssid = row.select("td.ssid-col").text(); String signalStrength = row.select("td.signal-col").text(); System.out.printf("SSID: %s | 信号强度: %s%n", ssid, signalStrength); }
关键注意事项
- Cookie会话保持:所有请求必须带上登录后的Cookie,否则会被重定向到登录页。
- CSRF令牌:很多Modem管理页面会有CSRF保护,需要从登录后的页面中提取令牌值,再放到扫描请求里。
- 请求头匹配:有些Modem会校验
Referer或User-Agent,可以把浏览器的请求头复制到JSoup的header()方法中。
内容的提问来源于stack exchange,提问作者Michael Becerra
相关产品推荐
相关产品推荐

