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

Android中Kotlin结合Jsoup异步爬取无响应问题求助

解决Kotlin中Jsoup爬取网页无响应的问题

我之前也碰到过一模一样的情况,加了Jsoup代码后函数就卡得像死循环似的,大概率是这几个核心原因导致的,咱们一步步来排查解决:

1. 主线程阻塞(最常见原因)

Jsoup的connect().get()是同步阻塞式的网络请求,如果你在Android的主线程或者JVM的UI线程里调用它,系统会直接限制这个操作(Android会触发ANR,JVM会让主线程卡住无响应),看起来就像陷入了无限循环。

解决方法:用后台线程执行Jsoup请求

推荐用Kotlin协程来处理,简单又安全:

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.jsoup.Jsoup

class KotScrape {
    fun getWebsite(url: String) = runBlocking {
        // 切换到IO线程执行网络请求
        launch(Dispatchers.IO) {
            try {
                val doc = Jsoup.connect(url)
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
                    .timeout(10000) // 设置10秒超时,避免无限等待
                    .get()
                // 处理爬取到的文档,比如获取标题
                val title = doc.title()
                println("网页标题:$title")
            } catch (e: Exception) {
                e.printStackTrace()
                println("爬取失败:${e.message}")
            }
        }
    }
}

2. 缺少网络权限(Android项目专属)

如果是Android应用,一定要在AndroidManifest.xml里添加网络权限,不然Jsoup根本发不出请求,只会默默卡住:

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

3. 目标网站的反爬拦截

很多网站会拦截没有合法User-Agent的请求,或者识别为爬虫后故意不返回响应。这时候咱们要模拟浏览器的请求头:

  • 一定要加userAgent()设置,就像上面代码里那样,用主流浏览器的UA字符串。
  • 如果网站有Cloudflare验证、验证码之类的,Jsoup就搞不定了(因为它不支持JS渲染),这时候可能需要用Selenium之类的工具,但先把基础的UA和超时设置好再说。

4. 未设置超时时间

Jsoup默认的超时时间可能很长,要是目标网站服务器没响应,你的函数就会一直等下去。所以一定要手动设置timeout(),比如10秒,到时间就会抛出超时异常,不会无限卡住。

先试试上面的方案,基本能解决大部分无响应的问题啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:48:51