You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:05:32