使用Jsoup爬取需登录网站时遭遇UnsupportedMimeTypeException异常求助
解决 Jsoup 抛出的 UnsupportedMimeTypeException 错误
你遇到的这个问题很典型——Jsoup 默认只会处理文本类、XML 或 XHTML 类型的响应,但你请求的 https://sso.mims.com/Account/Signin 返回了 application/json 格式的内容,直接触发了这个异常。结合 URL 是登录页面来看,大概率是因为没通过身份验证,服务器返回了 JSON 格式的错误提示或跳转指令,而非你预期的登录页面 HTML。
下面给你两个针对性的解决思路:
1. 临时绕过 MIME 类型检查(快速测试用)
如果只是想先拿到响应内容看看服务器返回了什么,可以在 Jsoup 请求里添加 ignoreContentType(true) 强制忽略 MIME 类型限制:
Document doc = Jsoup.connect("https://sso.mims.com/Account/Signin") .ignoreContentType(true) .get(); // 把响应转成字符串查看具体JSON内容 String jsonContent = doc.text(); System.out.println(jsonContent);
通过这种方式,你就能知道服务器到底返回了什么信息(比如是否要求携带登录凭证、是否有重定向指令)。
2. 正确处理身份验证(长期解决方案)
既然目标是爬取需要身份验证的网站,核心还是要走完登录流程获取有效会话:
- 第一步:先访问登录页面,获取页面内的 CSRF 令牌(多数网站登录都需要这个验证字段),这时候服务器应该返回正常的 HTML,不会触发 MIME 错误。
- 第二步:构造登录请求,携带用户名、密码、CSRF 令牌等参数,发送 POST 请求到登录接口。
- 第三步:保存登录后的会话 Cookie,后续爬取其他页面时带上这些 Cookie,服务器才会返回你需要的内容。
举个简单的登录流程示例:
// 1. 获取登录页面和CSRF令牌 Connection.Response loginPageResponse = Jsoup.connect("https://sso.mims.com/Account/Signin") .method(Connection.Method.GET) .execute(); Document loginDoc = loginPageResponse.parse(); // 假设CSRF令牌在name为__RequestVerificationToken的input标签里 String csrfToken = loginDoc.select("input[name=__RequestVerificationToken]").val(); // 2. 发送登录请求 Connection.Response loginResponse = Jsoup.connect("https://sso.mims.com/Account/Signin") .cookies(loginPageResponse.cookies()) // 带上登录页面的Cookie .data("__RequestVerificationToken", csrfToken) .data("Username", "你的用户名") .data("Password", "你的密码") .method(Connection.Method.POST) .execute(); // 3. 用登录后的Cookie爬取目标页面 Document targetDoc = Jsoup.connect("你需要爬取的目标URL") .cookies(loginResponse.cookies()) .get();
注意:不同网站的登录参数可能有差异,你可以用浏览器开发者工具(F12)查看真实的登录请求参数,再对应调整代码。
内容的提问来源于stack exchange,提问作者serendipity
相关产品推荐
相关产品推荐

