首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 爬蟲抓取荔枝 FM 隱藏音頻鏈接的實戰技巧

     編輯:程式設計綜合問答

問題場景

目標頁面:https://www.lizhi.fm/#/25734/20075765977745926
直接查看頁面源碼找不到音頻鏈接,但 Chrome DevTools Network 面板可見真實 MP3 地址:
https://cdn.lizhi.fm/audio/2015/05/16/20075765977745926_hd.mp3

核心原因

現代網站普遍採用前端渲染或動態加載:

  • HTML 源碼僅包含框架結構
  • 實際數據通過 JavaScript 異步請求 API 獲取
  • 音頻鏈接可能嵌入在 data-* 屬性、JSON 數據或 JavaScript 變量中

解決思路

1. 瀏覽器開發者工具定位數據源

  1. 打開 Network 面板,勾選 XHR/Fetch 過濾器
  2. 刷新頁面,尋找返回音頻信息的接口(通常包含 audio、track、play 關鍵字)
  3. 查看 Response,確認音頻 URL 字段

2. 常見隱藏位置

  • data-url / data-src 屬性:<div data-url="...mp3">
  • 內聯 Script 標籤:window.__INITIAL_STATE__ = {...} 或 var trackData = {...}
  • API 響應 JSON:直接請求後端接口獲取結構化數據

3. Java 實現方案

方案一:HttpClient + 正則/JSON 解析(輕量)

// 1. 獲取頁面 HTML
String html = HttpClientUtil.get(pageUrl);

// 2. 提取內聯 JSON 數據
Pattern p = Pattern.compile("window\\.__INITIAL_STATE__\\s*=\\s*(\\{.*?\\});", Pattern.DOTALL);
Matcher m = p.matcher(html);
if (m.find()) {
    String jsonStr = m.group(1);
    JSONObject json = JSON.parseObject(jsonStr);
    // 遍歷提取 audioUrl
}

// 3. 或直接請求 API 接口(需分析參數)
String apiUrl = "https://www.lizhi.fm/api/xxx?trackId=20075765977745926";
String apiResp = HttpClientUtil.get(apiUrl);
JSONObject data = JSON.parseObject(apiResp).getJSONObject("data");
String audioUrl = data.getString("url");

方案二:Selenium/WebDriver(重型,應對複雜加密/簽名)

WebDriver driver = new ChromeDriver();
driver.get(pageUrl);
// 等待 JS 執行完成
WebElement audioEl = driver.findElement(By.cssSelector("audio[src]"));
String audioUrl = audioEl.getAttribute("src");
driver.quit();

荔枝 FM 具體實踐建議

根據經驗,荔枝 FM 的音頻鏈接通常在:

  1. 頁面內 <script> 標籤中的 data-url 或 JSON 變量
  2. 專門的 API 接口:/api/audio/... 或 /track/...

建議步驟:

  1. 搜索頁面所有 data-url 屬性
  2. 搜索 .mp3 關鍵字定位腳本數據
  3. 分析 Network 中 track 相關 XHR 請求
  4. 模擬請求對應 API(注意 Header、Cookie、簽名參數)

反爬蟲應對

  • 設置合理 User-Agent、Referer
  • 處理 Cookie/Session 保持
  • 若有簽名算法,需逆向 JS 代碼或使用 Selenium
  • 限制請求頻率,避免 IP 封禁

核心原則:瀏覽器能看到的數據,Java 通過分析網絡請求或執行 JS 同樣能獲取。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved