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

Python 使用 urllib 依百度音樂分類下載 MP3 的實作

     編輯:更多程式設計知識

本文示範如何使用 Python 標準庫 urllib 與正則表達式,從百度音樂的分類頁面解析歌曲連結並批量下載 MP3 檔案。注意:僅供技術學習參考,請遵守網站服務條款與著作權法規。

核心步驟

  1. 請求分類頁面 HTML(如「經典流行」標籤頁)。
  2. 使用正則表達式提取歌曲 ID(/song/數字)。
  3. 組合下載頁面 URL(https://music.baidu.com/song/{id}/download)。
  4. 解析下載頁面,提取真實 MP3 連結與歌曲標題。
  5. 使用 urllib.urlretrieve 下載並以歌曲標題命名儲存。

完整程式碼(Python 2 風格)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib
import re

base_url = "https://music.baidu.com"
tag_url = "https://music.baidu.com/search/tag?key=經典流行"

html = urllib.urlopen(tag_url).read()
# 提取歌曲 ID
song_ids = re.findall(r'/song/(\d+)', html)

download_links = []
for sid in song_ids:
    download_links.insert(0, f"{base_url}/song/{sid}/download")

for link in download_links:
    try:
        page = urllib.urlopen(link).read()
        # 提取真實 MP3 連結
        mp3_url = re.search(r'https://[^ ]*xcode\.[a-z0-9]*', page).group()
        # 提取歌曲標題
        title_match = re.search(r'title="([^"]*)', page)
        title = title_match.group(1) if title_match else sid
        # 下載
        urllib.urlretrieve(mp3_url, f"{title}.mp3")
        print(f"Downloaded: {title}.mp3")
    except Exception as e:
        print(f"Failed {link}: {e}")

關鍵技術點

  • 正則表達式:用於從非結構化 HTML 中提取所需資訊,實際專案建議改用 BeautifulSoup 或 lxml 解析器,更穩健。
  • 錯誤處理:網路請求、解析、下載皆可能失敗,需包裝 try/except 避免中斷整批流程。
  • 編碼處理:中文關鍵字需正確編碼(Python 2 需 utf-8 聲明,Python 3 原生支援)。
  • 反爬蟲:百度音樂可能有反爬機制(User-Agent 檢查、Cookie、簽名驗證),若失效需模擬瀏覽器完整請求標頭。

現代化改寫建議(Python 3 + requests)

import requests
from bs4 import BeautifulSoup
import os

headers = {'User-Agent': 'Mozilla/5.0 ...'}
resp = requests.get(tag_url, headers=headers)
soup = BeautifulSoup(resp.text, 'html.parser')
# 使用 CSS 選擇器或 find_all 更可靠地提取資料

法律與道德提醒

音樂版權受法律保護,批量下載可能構成侵權。本程式碼僅作為網路爬蟲技術練習,請勿用於商業用途或大量散播,應支持正版音樂服務。

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