当我使用Kotlin来编写一个简单的APP爬虫。但是由于在Android平台上直接进行网络请求和解析HTML可能涉及到一些限制(如网络权限、主线程限制等),所以对于我来说,我通常会使用一些库来简化操作。

在我这里经常使用Jsoup库解析HTML。以下是一个基础实现示例,包含网络请求、HTML解析和结果展示:
1、添加依赖 (app/build.gradle.kts)
kotlin
dependencies {
implementation("org.jsoup:jsoup:1.15.3") // HTML解析库
implementation("com.squareup.okhttp3:okhttp:4.10.0") // 网络请求
}
2、AndroidManifest.xml 添加权限
xml
<uses-permission android:name="android.permission.INTERNET" />
3、核心爬虫代码 (示例爬取书籍标题)
kotlin
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.Jsoup
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 启动爬虫
crawlData("https://books.toscrape.com/")
}
private fun crawlData(url: String) {
CoroutineScope(Dispatchers.IO).launch {
try {
// 1. 获取网页HTML
val html = fetchHtml(url)
// 2. 解析数据
val bookTitles = parseHtml(html)
// 3. 主线程更新UI
withContext(Dispatchers.Main) {
// 此处替换为你的UI更新代码
println("爬取结果: ${bookTitles.joinToString()}")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
private fun fetchHtml(url: String): String {
val client = OkHttpClient()
val request = Request.Builder().url(url).build()
return client.newCall(request).execute().use { response ->
if (!response.isSuccessful) throw Exception("请求失败: ${response.code}")
response.body?.string() ?: throw Exception("空响应")
}
}
private fun parseHtml(html: String): List<String> {
val doc = Jsoup.parse(html)
return doc.select("article.product_pod h3 a").map { it.attr("title") }
}
}
4、功能说明
- 网络请求:使用OkHttp获取网页内容
- HTML解析:通过Jsoup CSS选择器提取书籍标题
- 异步处理:使用协程避免主线程阻塞
- 数据提取:从CSS选择器获取属性值
5、高级功能扩展
kotlin
// 如果需要处理动态加载内容(如JavaScript渲染):
implementation("org.seleniumhq.selenium:selenium-android-driver:4.3.0")
// 处理分页
fun crawlMultiPage(baseUrl: String, pages: Int) {
(1..pages).forEach { page ->
crawlData("$baseUrl/page-$page.html")
}
}
// 设置请求头模拟浏览器
val request = Request.Builder()
.url(url)
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...")
.build()
注意事项
- 法律合规:确保目标网站允许爬取,遵守robots.txt协议
- 频率控制:添加延时避免被封IP
kotlin
delay(3000) // 每次请求间隔3秒
- 错误处理:增加重试机制
- 动态内容:对SPA网站需使用Selenium等工具
- 数据存储:可结合Room数据库保存结果
完整流程
是 否 启动爬虫 发送HTTP请求 请求成功? Jsoup解析HTML 错误处理 CSS选择器提取数据 处理/存储数据 更新UI
上图展示了Kotlin爬虫的核心流程。当我们在实际应用中需根据目标网站结构调整CSS选择器,并添加适当的异常处理和性能优化。尤其是对于复杂网站,可能需要处理登录验证、反爬机制等高级功能。