如何使用Java的Jsoup登录含动态Token生成的受保护网页?
解决Jsoup爬虫中动态生成Token/参数的登录问题
针对你遇到的带BlazingWebCookie、动态bfu/blazing_answer参数的网站登录流程,以及同类动态Token生成网站的通用解决方案,整理如下:
一、针对该网站的分步实现方案
1. 捕获初始BlazingWebCookie
首先发起主页请求,获取并保存响应中的Cookie集合:
// 发起初始GET请求,获取BlazingWebCookie Connection.Response initialResp = Jsoup.connect("https://目标网站域名") .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") .execute(); Map<String, String> cookies = new HashMap<>(initialResp.cookies());
2. 解析JS逻辑生成bfu和blazing_answer参数
从初始响应的HTML中提取生成参数的JS代码,分析其生成逻辑后用Java重实现。
比如假设页面JS生成逻辑是:
var bfu = Date.now().toString(); var webCookie = document.cookie.match(/BlazingWebCookie=([^;]+)/)[1]; var blazing_answer = md5(bfu + webCookie);
对应的Java实现(需引入Apache Commons Codec工具类):
import org.apache.commons.codec.digest.DigestUtils; // 生成bfu(当前时间戳字符串) String bfu = String.valueOf(System.currentTimeMillis()); // 获取BlazingWebCookie值 String blazingWebCookie = cookies.get("BlazingWebCookie"); // 生成blazing_answer String blazingAnswer = DigestUtils.md5Hex(bfu + blazingWebCookie);
3. 请求获取BlazingPuzzleCookie
携带已有的Cookie和生成的参数发起GET请求,处理302跳转并更新Cookie集合:
Connection.Response puzzleResp = Jsoup.connect("https://目标网站域名/验证接口路径") .cookies(cookies) .data("bfu", bfu) .data("blazing_answer", blazingAnswer) .followRedirects(true) .execute(); // 合并新获取的BlazingPuzzleCookie cookies.putAll(puzzleResp.cookies());
4. 获取Session Cookie
用更新后的Cookie重新请求主页,获取会话Cookie:
Connection.Response sessionResp = Jsoup.connect("https://目标网站域名") .cookies(cookies) .execute(); cookies.putAll(sessionResp.cookies());
5. 发起POST请求完成登录
携带所有Cookie和登录凭证提交请求:
Connection.Response loginResp = Jsoup.connect("https://目标网站域名/登录接口路径") .cookies(cookies) .data("username", "你的用户名") .data("password", "你的密码") .method(Connection.Method.POST) .execute(); // 登录成功后,cookies中已包含有效会话Cookie,可用于访问受保护页面 Document protectedPage = Jsoup.connect("https://目标网站域名/受保护页面") .cookies(cookies) .get();
二、同类动态Token网站的通用解决方案
方案1:解析JS逻辑重实现
- 适用场景:参数生成逻辑简单、无混淆的JS代码
- 操作步骤:抓包获取页面JS → 分析参数生成算法 → 用Java重写对应逻辑
- 优势:性能高、无额外依赖;劣势:遇到混淆JS时分析成本高
方案2:用支持JS执行的工具配合Jsoup
如果JS逻辑复杂难以解析,可使用HtmlUnit、Selenium等工具自动执行页面JS,完成参数生成和跳转后再提取Cookie给Jsoup使用:
import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; import java.util.HashMap; import java.util.Map; WebClient webClient = new WebClient(); webClient.getOptions().setJavaScriptEnabled(true); webClient.getOptions().setThrowExceptionOnScriptError(false); webClient.getOptions().setCssEnabled(false); // 访问主页,自动执行JS完成参数生成和跳转 HtmlPage page = webClient.getPage("https://目标网站域名"); // 提取所有Cookie Map<String, String> cookies = new HashMap<>(); webClient.getCookieManager().getCookies().forEach(cookie -> cookies.put(cookie.getName(), cookie.getValue()) ); // 关闭WebClient,后续用Jsoup携带Cookie操作 webClient.close(); // 用获取到的Cookie发起登录请求 Connection.Response loginResp = Jsoup.connect("https://目标网站域名/登录路径") .cookies(cookies) .data("username", "你的用户名") .data("password", "你的密码") .post();
- 优势:无需分析JS逻辑,自动处理动态参数和跳转;劣势:性能相对较低,需处理浏览器兼容性问题
方案3:抓包获取参数生成接口
部分网站的动态参数是通过单独的后端接口返回的,可直接调用该接口获取参数。
操作步骤:用Chrome DevTools/Fiddler抓包 → 找到生成参数的API接口 → 直接请求该接口获取参数
三、注意事项
- 模拟真实请求头:每次请求都带上
User-Agent、Referer等头部,避免触发反爬机制 - 严格遵循网站请求流程:按实际登录顺序发起请求,不要跳过任何步骤
- 处理Cookie的持续更新:每次响应的Cookie都要合并到Cookie集合中,确保后续请求携带完整凭证
内容的提问来源于stack exchange,提问作者Mustafa Yilmaz
相关产品推荐
相关产品推荐

