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

Android中使用Jsoup实现登录并爬取登录后页面标题的方法

在Android中使用Jsoup实现登录并爬取页面标题

我来帮你完善这个登录和爬取的流程,其实你已经走对了第一步——获取登录页面的隐藏参数,接下来把剩下的环节补全就行~

第一步:准备工作

首先确保你的Android项目已经引入Jsoup依赖,在app/build.gradle的dependencies块中添加:

implementation 'org.jsoup:jsoup:1.17.2'

同时,别忘了在AndroidManifest.xml中添加网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

第二步:完善登录流程(包含会话保持)

Android中不能在主线程做网络请求,所以我们用协程(Coroutine)来实现,核心逻辑和你写的部分衔接紧密:

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.jsoup.Connection
import org.jsoup.Jsoup

// 替换成你的实际登录页URL和目标页URL
const val LOGIN_URL = "你的登录页面URL"
const val TARGET_PAGE_URL = "登录后要爬取的页面URL"

fun loginAndCrawlTitle(username: String, password: String) {
    GlobalScope.launch(Dispatchers.Main) {
        try {
            // 1. 先请求登录页面,获取隐藏参数和会话Cookie
            val loginFormResponse = withContext(Dispatchers.IO) {
                Jsoup.connect(LOGIN_URL)
                    .method(Connection.Method.GET)
                    .timeout(10000)
                    .execute()
            }

            // 解析登录页面,提取隐藏字段(要和表单实际参数名严格对应)
            val loginDoc = loginFormResponse.parse()
            val urlCacheValue = loginDoc.select("input[name=urlCache]").attr("value")
            // 如果页面还有其他隐藏验证字段(比如csrfToken),也要一并提取

            // 2. 发送POST登录请求,带上所有必要参数和会话Cookie
            val loginResponse = withContext(Dispatchers.IO) {
                Jsoup.connect(LOGIN_URL)
                    .method(Connection.Method.POST)
                    .timeout(10000)
                    // 带上之前获取的Cookie,维持会话状态
                    .cookies(loginFormResponse.cookies())
                    // 提交表单参数,参数名必须和登录页表单的name属性完全一致
                    .data("urlCache", urlCacheValue)
                    .data("spa", "")
                    .data("stepUp", "false")
                    .data("facilitatedUrl", "")
                    .data("userId", username)
                    .data("password", password)
                    // 如果登录按钮有name参数(比如submit),也要加上
                    .data("submit", "登录")
                    .execute()
            }

            // 3. 验证登录是否成功(可通过跳转URL或页面内容判断)
            val isLoginSuccess = loginResponse.url().toString() == TARGET_PAGE_URL 
                    || loginResponse.parse().select("div.user-avatar").isNotEmpty() // 假设登录后有用户头像模块

            if (isLoginSuccess) {
                // 4. 登录成功后,爬取目标页面的标题
                val targetDoc = withContext(Dispatchers.IO) {
                    Jsoup.connect(TARGET_PAGE_URL)
                        .cookies(loginResponse.cookies()) // 带上登录后的会话Cookie
                        .get()
                }
                val pageTitle = targetDoc.title()
                // 在这里处理标题,比如更新UI
                println("爬取到的页面标题:$pageTitle")
            } else {
                println("登录失败,请检查用户名密码或表单参数是否正确")
            }
        } catch (e: Exception) {
            e.printStackTrace()
            println("网络请求或解析出错:${e.message}")
        }
    }
}

关键注意事项

  • 表单参数必须完全匹配:你代码里的spa、stepUp等参数,一定要和登录页面HTML表单中的name属性完全一致,否则登录会被拒绝。可以用Chrome开发者工具查看登录表单的实际参数。
  • 会话Cookie的保持:登录请求和后续爬取请求必须携带同一个会话的Cookie,否则网站会判定你未登录。
  • 网络请求线程:Android禁止在主线程发起网络请求,所以必须用协程、AsyncTask或其他异步方式处理。
  • 异常处理:网络波动、页面结构变化都可能导致请求失败,一定要做好异常捕获和提示。

内容的提问来源于stack exchange,提问作者sudharsan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:26:08