如何用Kotlin结合Jsoup爬取克罗地亚动物收容所网站数据?求学习资源
解决Android下用Jsoup爬取动物收容所数据及地理编码问题
一、用Jsoup爬取目标网站数据
1. 添加Jsoup依赖
在Module级别的build.gradle中添加依赖:
implementation 'org.jsoup:jsoup:1.17.2'
2. 定义数据类
先创建存储收容所信息的数据类:
data class AnimalShelter( val name: String, val address: String, val city: String )
3. 爬取单页数据
注意:Android禁止在主线程执行网络请求,所有爬取操作要放在子线程或协程中:
// 爬取指定页码的收容所数据 fun fetchShelters(page: Int): List<AnimalShelter> { val targetUrl = "https://jic.mps.hr/sklonista/#!sklonista?page=$page" val doc = Jsoup.connect(targetUrl).get() val shelterList = mutableListOf<AnimalShelter>() // 定位表格行(跳过表头,只取数据行) val rows = doc.select("table tbody tr") rows.forEach { row -> val columns = row.select("td") // 确保列数足够,避免数组越界 if (columns.size >= 4) { val name = columns[1].text().trim() // 第二列:收容所名称 val address = columns[2].text().trim() // 第三列:地址 val city = columns[3].text().trim() // 第四列:城市 shelterList.add(AnimalShelter(name, address, city)) } } return shelterList }
4. 处理分页(3页数据)
循环调用单页爬取方法,整合所有数据:
fun fetchAllShelters(): List<AnimalShelter> { val allShelters = mutableListOf<AnimalShelter>() // 遍历1-3页 for (page in 1..3) { val pageData = fetchShelters(page) allShelters.addAll(pageData) } return allShelters }
注意:如果网站是动态加载数据(点击分页才渲染),Jsoup无法获取动态生成的HTML,此时需要用Chrome开发者工具的Network面板,找到加载数据的API接口,直接请求JSON接口会更高效。
二、地理编码实现(谷歌地图标记)
要将地址转换为经纬度,可使用谷歌地图的Geocoding功能:
- 先在Google Cloud Console申请API密钥,并启用Geocoding API
- 添加谷歌服务依赖到
build.gradle:
implementation 'com.google.android.gms:play-services-maps:18.2.0' implementation 'com.google.android.gms:play-services-location:21.0.1'
- 地理编码示例代码(用协程异步执行):
// 根据地址获取经纬度 fun getCoordinates(context: Context, address: String, callback: (Pair<Double, Double>?) -> Unit) { val geocoder = Geocoder(context, Locale.getDefault()) CoroutineScope(Dispatchers.IO).launch { try { // 只取第一个匹配的结果 val addressResult = geocoder.getFromLocationName("$address, ${Locale.getDefault().country}", 1) if (!addressResult.isNullOrEmpty()) { val lat = addressResult[0].latitude val lng = addressResult[0].longitude withContext(Dispatchers.Main) { callback(Pair(lat, lng)) } } else { withContext(Dispatchers.Main) { callback(null) } } } catch (e: IOException) { e.printStackTrace() withContext(Dispatchers.Main) { callback(null) } } } }
调用时传入收容所的完整地址(地址+城市),拿到经纬度后即可在谷歌地图上添加标记。
三、Kotlin Android开发学习工具推荐
- Android Studio:官方IDE,自带Kotlin语法支持、代码提示、调试工具和模拟器,是开发Android应用的必备工具
- Kotlin Playground:在线运行Kotlin代码的平台,无需搭建本地环境,适合练习基础语法
- JetBrains Academy:交互式学习平台,包含Kotlin基础和Android开发实战项目,边学边练
- Google Codelabs:官方推出的Android开发教程,从入门到进阶,全部是实战导向的项目
- Stack Overflow:遇到开发问题时搜索解决方案,也可以提问求助社区
内容的提问来源于stack exchange,提问作者Sara P
相关产品推荐
相关产品推荐

