如何用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
相关产品推荐
相关产品推荐

