Python实现百度FM内容抓取与LST文件生成指南

一、技术背景与需求分析

随着音频内容数字化的发展,音乐平台的内容管理需求日益增长。开发者常需通过自动化手段获取音乐元数据(如歌曲名、歌手、专辑等),并将其整理为结构化文件供后续处理。百度FM作为主流音乐服务平台,其内容获取与格式转换成为典型技术场景。

LST文件(List File)是一种文本格式的列表文件,每行存储一个数据项,常用于机器学习数据集标注、文件路径管理或元数据存储。生成LST文件的核心需求包括:

  1. 数据抓取:从目标平台获取音乐内容及元数据
  2. 结构化处理:将非结构化数据转换为标准字段
  3. 文件输出:按指定格式写入磁盘

二、技术实现方案

1. 环境准备

  1. # 基础库安装
  2. pip install requests beautifulsoup4 pandas
  • requests:处理HTTP请求
  • BeautifulSoup:解析HTML响应
  • pandas(可选):高级数据处理

2. 请求与响应处理

2.1 模拟浏览器请求

  1. import requests
  2. def fetch_fm_content(url):
  3. headers = {
  4. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
  5. 'Referer': 'https://music.baidu.com/'
  6. }
  7. try:
  8. response = requests.get(url, headers=headers, timeout=10)
  9. response.raise_for_status()
  10. return response.text
  11. except requests.exceptions.RequestException as e:
  12. print(f"请求失败: {e}")
  13. return None

关键点

  • 配置User-AgentReferer模拟正常访问
  • 设置超时时间避免程序阻塞
  • 异常处理确保程序健壮性

2.2 响应数据解析

假设返回的HTML中包含以下结构:

  1. <div class="song-item">
  2. <span class="song-name">稻香</span>
  3. <span class="artist">周杰伦</span>
  4. <span class="album">魔杰座</span>
  5. </div>

解析代码如下:

  1. from bs4 import BeautifulSoup
  2. def parse_song_info(html):
  3. soup = BeautifulSoup(html, 'html.parser')
  4. items = soup.find_all('div', class_='song-item')
  5. songs = []
  6. for item in items:
  7. song = {
  8. 'name': item.find('span', class_='song-name').text.strip(),
  9. 'artist': item.find('span', class_='artist').text.strip(),
  10. 'album': item.find('span', class_='album').text.strip()
  11. }
  12. songs.append(song)
  13. return songs

优化建议

  • 使用CSS选择器提高解析效率
  • 添加字段存在性检查
  • 处理编码异常(如response.encoding = 'utf-8'

3. LST文件生成

3.1 基础格式实现

  1. def generate_lst_file(songs, output_path):
  2. with open(output_path, 'w', encoding='utf-8') as f:
  3. for song in songs:
  4. line = f"{song['name']}\t{song['artist']}\t{song['album']}\n"
  5. f.write(line)
  6. print(f"LST文件已生成: {output_path}")

字段分隔符选择

  • 制表符\t:适合多字段对齐
  • 逗号,:需处理文本中的逗号转义
  • 自定义符号:如|;;

3.2 增强版实现(支持JSON格式)

  1. import json
  2. def generate_enhanced_lst(songs, output_path, format='txt'):
  3. if format == 'txt':
  4. with open(output_path, 'w', encoding='utf-8') as f:
  5. for song in songs:
  6. f.write(json.dumps(song, ensure_ascii=False) + '\n')
  7. elif format == 'json':
  8. with open(output_path, 'w', encoding='utf-8') as f:
  9. json.dump(songs, f, ensure_ascii=False, indent=2)

适用场景

  • 纯文本LST:简单数据存储
  • JSON格式:需要保留数据结构的场景

4. 完整流程示例

  1. def main():
  2. # 1. 获取页面内容
  3. url = "https://music.baidu.com/toplist/xxx" # 替换为实际URL
  4. html = fetch_fm_content(url)
  5. if not html:
  6. return
  7. # 2. 解析数据
  8. songs = parse_song_info(html)
  9. if not songs:
  10. print("未解析到有效数据")
  11. return
  12. # 3. 生成文件
  13. output_path = "baidu_fm_songs.lst"
  14. generate_lst_file(songs, output_path)
  15. # 可选:生成JSON备份
  16. generate_enhanced_lst(songs, "baidu_fm_songs.json", format='json')
  17. if __name__ == "__main__":
  18. main()

三、进阶优化方向

1. 性能优化

  • 并发请求:使用asynciorequests-html实现异步抓取
  • 缓存机制:对已抓取页面进行本地缓存
  • 增量更新:通过文件修改时间戳判断是否需要重新抓取

2. 反爬策略应对

  • IP轮换:使用代理池(需遵守平台规则)
  • 请求间隔time.sleep(random.uniform(1, 3))
  • Cookie管理:维护会话状态(适用于登录后内容)

3. 数据验证

  1. def validate_song_data(song):
  2. required_fields = ['name', 'artist']
  3. for field in required_fields:
  4. if field not in song or not song[field]:
  5. return False
  6. return True

四、注意事项

  1. 合规性

    • 遵守目标平台的robots.txt规则
    • 控制请求频率避免被封禁
    • 仅用于个人学习或合法数据收集
  2. 异常处理

    • 网络超时重试机制
    • 字段缺失时的默认值处理
    • 文件写入权限检查
  3. 扩展性设计

    • 将URL生成逻辑抽象为函数
    • 支持命令行参数输入
    • 添加日志记录功能

五、总结

本文通过完整的Python实现,展示了从百度FM平台抓取音乐内容并生成LST文件的技术流程。关键技术点包括:

  • 模拟浏览器请求获取HTML内容
  • 使用BeautifulSoup解析结构化数据
  • 实现多种格式的LST文件输出
  • 异常处理与性能优化策略

开发者可根据实际需求调整解析逻辑和输出格式,该方案同样适用于其他音乐平台的数据抓取场景。建议在实际部署前充分测试反爬策略和数据完整性验证机制。