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

如何用Jsoup(Java)发送POST请求获取Servientrega物流追踪结果

解决Servientrega物流追踪的Jsoup POST请求问题

嘿,我看你已经着手用Jsoup尝试爬取Servientrega的物流追踪信息了,不过代码还没写完,我来帮你补全并梳理整个流程——这类ASP.NET驱动的网站,直接发POST请求往往需要先获取页面里的隐藏表单参数才行,不然大概率会被服务器拒绝哦。

完整实现步骤&代码

首先得先发送GET请求拿到初始页面,提取出表单里的__VIEWSTATE、__EVENTVALIDATION这类必备的隐藏参数,再构造POST请求带上这些参数和追踪单号:

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;

public class ServientregaTracker {
    public static void main(String[] args) {
        String trackingNumber = "2003159943";
        String baseUrl = "https://www.servientrega.com/wps/portal/Colombia/transacciones-personas/rastreo-envios";

        try {
            // 第一步:发送GET请求获取初始页面,提取表单隐藏参数
            Connection.Response initialResponse = Jsoup.connect(baseUrl)
                    .validateTLSCertificates(false) // 临时跳过证书验证,生产环境慎用
                    .method(Connection.Method.GET)
                    .execute();
            Document initialDoc = initialResponse.parse();

            // 提取ASP.NET表单必备的验证参数
            String viewState = initialDoc.select("#__VIEWSTATE").attr("value");
            String viewStateGenerator = initialDoc.select("#__VIEWSTATEGENERATOR").attr("value");
            String eventValidation = initialDoc.select("#__EVENTVALIDATION").attr("value");
            // 处理表单提交地址,可能是相对路径,需要拼接成完整URL
            String formAction = initialDoc.select("form#aspnetForm").attr("action");
            if (!formAction.startsWith("http")) {
                formAction = baseUrl + formAction;
            }

            // 第二步:构造POST请求,带上所有必要参数和会话Cookie
            Connection.Response postResponse = Jsoup.connect(formAction)
                    .validateTLSCertificates(false)
                    .cookies(initialResponse.cookies()) // 维持会话,避免被判定为非法请求
                    .data("__VIEWSTATE", viewState)
                    .data("__VIEWSTATEGENERATOR", viewStateGenerator)
                    .data("__EVENTVALIDATION", eventValidation)
                    .data("ctl00$ContentPlaceHolder1$txtGuia", trackingNumber) // 追踪单号对应的输入框name
                    .data("ctl00$ContentPlaceHolder1$btnBuscar", "Buscar") // 搜索按钮的参数
                    .method(Connection.Method.POST)
                    .execute();

            // 第三步:解析返回页面,提取追踪结果
            Document resultDoc = postResponse.parse();
            Elements trackingTable = resultDoc.select("#ContentPlaceHolder1_grvResultado");
            if (!trackingTable.isEmpty()) {
                System.out.println("追踪结果:");
                // 这里可以根据页面结构进一步解析表格里的状态、时间、地点等具体信息
                System.out.println(trackingTable.html());
            } else {
                System.out.println("未找到追踪结果,可能单号有误或页面结构已变更");
            }

        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("请求过程中出错:" + e.getMessage());
        }
    }
}

关键注意点

  • 隐藏参数的必要性:ASP.NET网站的表单依赖__VIEWSTATE、__EVENTVALIDATION这类服务器生成的验证令牌,必须随POST请求一起发送,否则请求会被直接拒绝。
  • 会话Cookie维持:GET请求获取的Cookie要带到POST请求里,让服务器识别你的会话,避免被拦截。
  • 页面结构变更适配:如果后续网站改了输入框name或者表单结构,你可以用浏览器F12开发者工具查看表单提交的参数,调整代码里的选择器和参数名就行。
  • 生产环境提示:validateTLSCertificates(false)只是临时调试用的,正式环境一定要保留证书验证,避免安全风险。

内容的提问来源于stack exchange,提问作者Germán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:10:41