Jsoup 登录网站 returns 只有头 html

Jsoup Login in to website returns only head of the html

我在尝试登录网站时遇到了这个问题。我正在尝试登录此网站:https://student.naviance.com/sbrunswick。作为示例,我正在尝试抓取网站中的用户名称。

这是我现在的代码:

String initialUrl = "https://student.naviance.com/sbrunswick";
String finalUrl = "https://student.naviance.com/main";
String username = "***myusername***";
String password = "***mypassword***";

Connection.Response loginPageResponse = Jsoup.connect(initialUrl)
                                .userAgent("Mozilla/5.0")
                                .timeout(10 * 1000)
                                .followRedirects(true)
                                .execute();

Map<String, String> cookie = loginPageResponse.cookies();

Map<String, String> mapParams = new HashMap<String, String>();
mapParams.put("login-username", username);
mapParams.put("login-password", password);
mapParams.put("remember_me", "");

Connection.Response responsePostLogin = Jsoup.connect(finalUrl)
                        .referrer(initialUrl)
                        .userAgent("Mozilla/5.0")
                        .timeout(10 * 1000)
                        .data(mapParams)
                        .cookies(cookie)
                        .followRedirects(true)
                        .execute();

Document document = responsePostLogin.parse();
Log.d("HTML", document.html());

Document page = Jsoup.connect(finalUrl).userAgent("Mozilla/5.0").cookies(cookie).get();
Log.d("NAME", page.select(".h1 components-PageTitle-styles-pageTitle components-LandingHeader-styles-title").text());

我分析了网站的表格,我很确定我填写了所有表格(包括隐藏表格)。但是,HTML 日志并未显示整个 HTML 页面。它只显示头部。这是当我在 Android Studio 的 Logcat 中搜索“HTML”时日志显示的内容。

<!doctype html>
<html lang="en-US">
 <head>
  <title>Naviance Student</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <link rel="apple-touch-icon" href="/apple-icon.png">
  <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
  <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
  <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
  <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
  <link rel="apple-touch-startup-image" href="/apple-icon.png">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-title" content="Naviance Student">
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
  <link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
  <link rel="manifest" href="/manifest.json">
  <meta http-equiv="Page-Enter" content="RevealTrans(Duration=2.0,Transition=2)">
  <meta http-equiv="Page-Exit" content="RevealTrans(Duration=3.0,Transition=12)">
  <meta http-equiv="cleartype" content="on">
  <meta name="msapplication-config" content="IEconfig.xml">
  <meta name="application-name" content="Naviance Student">
  <meta name="author" content="Naviance">
  <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
  <link href="/style-16726.css" rel="stylesheet">
  <link rel="preload" href="/main.e6791.js" as="script">
 </head>
 <body> 
  <script src="/rewritten_config.js?v=1605811315155"></script> 
  <div id="root"></div>
  <script src="/fc.vendors~main.bb74e.js"></script>
  <script src="/main.e6791.js" async></script>
 </body>
</html>

尽管这段代码说的是“body”,但当我进入实际网站并查看时,这段代码实际上是头部的一部分。

我对 Jsoup 还是个新手,我以为我明白了,所以我去庆祝以为我明白了半个小时才意识到它不起作用。

关于如何解决这个问题的任何想法?谢谢。

如果您了解 JSoup,您可能了解它的工作原理。 HTML 和 HTTP 的工作方式可能有很大差异...static/responsive/mostly 静态与 cookies/etc 中的一些 responsive/use。

您需要弄清楚是否还有其他事情发生。我怀疑执行登录不会像单独传递 username/password 那样简单,而是需要一个 session ID,可能是一个 'Referer' header 和某种形式的令牌。

如果您打开 /rewritten_config.js?v=1605811315155,您可能会发现一些 GET ajax 请求和一堆 document.write 语句……可能被严重混淆了。可以理解发生了什么,但我通常会为此苦苦挣扎,所以不会花时间在上面。

您最好尝试其他技术,例如 selenium/phantomJS 或其他 headless-browser。 HtmlUnit 类似于 Jsoup,可能会起作用,但您必须尝试一下才能看到。