使用Jsoup爬取Indie88电台当前播放歌曲及歌手信息遇阻求助
搞定Jsoup爬取indie88.com当前播放歌曲的问题
嘿Brianna,我猜你现在卡壳的原因大概率是这个电台网站的当前播放信息是靠JavaScript动态加载的——Jsoup只能抓取页面一开始就加载好的静态HTML,而像indie88这类实时更新内容的网站,会用AJAX请求后端API来获取播放数据,再渲染到页面上,所以直接用Jsoup解析页面源码自然找不到你要的内容啦。
第一步:找到数据的真实来源
先打开浏览器的开发者工具(按F12就行),切换到「网络」标签页,刷新页面后,在筛选器里选「XHR/获取」,你就能看到网站偷偷请求的API接口了——比如indie88会请求一个类似https://indie88.com/wp-json/radio/v1/current-track的接口,返回的是JSON格式的数据,里面就包含了歌手和歌曲名,这才是我们该抓的目标。
第二步:换个方式,直接请求API
Jsoup擅长解析HTML,但处理JSON接口的话,我们用HTTP客户端更合适,比如用OkHttp(或者Java 11自带的HttpClient),再配合JSON解析库(比如Jackson)来处理返回的数据。
给你写个完整的示例:
先加依赖(如果用Maven的话)
<dependencies> <!-- OkHttp 用来发HTTP请求 --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.11.0</version> </dependency> <!-- Jackson 用来解析JSON --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> </dependencies>
代码实现
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import java.io.IOException; public class Indie88Scraper { public static void main(String[] args) { // 这里填你从浏览器里找到的真实API地址 String apiUrl = "https://indie88.com/wp-json/radio/v1/current-track"; OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(apiUrl) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new IOException("请求失败,状态码: " + response.code()); // 解析返回的JSON数据 ObjectMapper mapper = new ObjectMapper(); JsonNode trackData = mapper.readTree(response.body().string()); // 提取歌手和歌曲名(字段名要和API返回的JSON对应) String artist = trackData.get("artist").asText(); String song = trackData.get("title").asText(); System.out.println("当前正在播放:" + artist + " - " + song); } catch (IOException e) { e.printStackTrace(); } } }
要是你非要用Jsoup(仅当数据是静态渲染时)
如果哪天indie88把播放信息改回静态HTML了,你可以用Jsoup的选择器来定位元素。先在浏览器里用「检查元素」找到对应的标签和类名,比如假设结构是这样:
<div class="now-playing"> <p class="artist">独立歌手</p> <p class="song">好听的歌</p> </div>
那Jsoup代码可以这么写:
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import java.io.IOException; public class JsoupRadioTest { public static void main(String[] args) { try { Document doc = Jsoup.connect("https://indie88.com").get(); // 这里的选择器要和页面实际元素匹配 Element nowPlaying = doc.selectFirst(".now-playing"); if (nowPlaying != null) { String artist = nowPlaying.select(".artist").text(); String song = nowPlaying.select(".song").text(); System.out.println("当前播放:" + artist + " - " + song); } else { System.out.println("没找到播放信息,大概率是动态加载的,建议用API方式"); } } catch (IOException e) { e.printStackTrace(); } } }
不过再强调一遍:现在indie88的播放信息是动态加载的,所以第一种直接请求API的方式才是能拿到数据的正确路径哦~
内容的提问来源于stack exchange,提问作者Brianna
相关产品推荐
相关产品推荐

