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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:20:52