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

一、技术背景与需求分析

随着语音交互技术的普及,音频内容平台的API接口成为开发者获取结构化数据的重要途径。百度FM作为国内领先的音频服务平台,提供了丰富的节目资源库,开发者可通过其开放接口获取节目元数据、分类信息及播放链接等内容。

在实际应用场景中,将抓取的音频数据转换为LST(List)文件格式具有显著价值。LST文件作为纯文本结构,可被机器学习框架直接读取用于模型训练,也可作为数据交换中间格式供其他系统处理。本文重点解决三个技术问题:如何合法获取百度FM的API数据、如何解析JSON响应并提取关键字段、如何将数据转换为规范的LST文件。

二、API调用与数据获取

1. 接口认证机制

百度FM开放平台采用OAuth2.0认证协议,开发者需先在控制台创建应用获取API Key和Secret。认证流程包含三步:

  • 生成授权码(Authorization Code)
  • 交换访问令牌(Access Token)
  • 令牌刷新机制
  1. import requests
  2. def get_access_token(api_key, secret):
  3. url = "https://openapi.baidu.com/oauth/2.0/token"
  4. params = {
  5. "grant_type": "client_credentials",
  6. "client_id": api_key,
  7. "client_secret": secret
  8. }
  9. response = requests.get(url, params=params)
  10. return response.json().get("access_token")

2. 数据请求接口

核心数据接口采用RESTful设计,支持按分类、关键词、时间范围等维度查询。典型请求参数包括:

  • method: 接口方法名(如fm.program.list
  • access_token: 认证令牌
  • category_id: 分类ID
  • page_size: 每页数量
  • pn: 页码
  1. def fetch_fm_data(token, category_id=None, keyword=None):
  2. base_url = "https://openapi.baidu.com/rest/2.0/fm"
  3. params = {
  4. "method": "fm.program.list",
  5. "access_token": token,
  6. "format": "json"
  7. }
  8. if category_id:
  9. params["category_id"] = category_id
  10. if keyword:
  11. params["keyword"] = keyword
  12. response = requests.get(base_url, params=params)
  13. return response.json()

三、数据解析与结构化处理

1. JSON响应解析

百度FM API返回标准JSON格式数据,核心字段包括:

  • program_id: 节目唯一标识
  • title: 节目名称
  • category: 分类信息
  • duration: 播放时长(秒)
  • play_url: 播放链接
  • update_time: 更新时间戳
  1. def parse_program_data(json_data):
  2. programs = []
  3. for item in json_data.get("programs", []):
  4. programs.append({
  5. "id": item.get("program_id"),
  6. "title": item.get("title"),
  7. "category": item.get("category", {}).get("name"),
  8. "duration": item.get("duration"),
  9. "url": item.get("play_url")
  10. })
  11. return programs

2. 异常处理机制

需重点处理三类异常场景:

  • 网络请求失败(超时、连接错误)
  • 认证令牌过期(401错误)
  • 数据格式异常(字段缺失)
  1. def safe_fetch(token, **kwargs):
  2. try:
  3. data = fetch_fm_data(token, **kwargs)
  4. if data.get("error_code"):
  5. if data["error_code"] == 401:
  6. # 令牌过期处理
  7. token = get_access_token(API_KEY, SECRET)
  8. return safe_fetch(token, **kwargs)
  9. raise Exception(f"API Error: {data}")
  10. return data
  11. except requests.exceptions.RequestException as e:
  12. print(f"Network Error: {str(e)}")
  13. return None

四、LST文件生成规范

1. 文件格式要求

标准LST文件应满足:

  • 每行记录一个节目信息
  • 字段间用制表符(\t)分隔
  • 首行为字段名(可选)
  • 编码格式为UTF-8无BOM

示例格式:

  1. program_id title category duration play_url
  2. 12345 新闻早报 时事 1800 http://...

2. 生成实现代码

  1. def generate_lst_file(programs, output_path):
  2. with open(output_path, 'w', encoding='utf-8') as f:
  3. # 写入表头(可选)
  4. f.write("program_id\ttitle\tcategory\tduration\tplay_url\n")
  5. for program in programs:
  6. line = "\t".join([
  7. str(program["id"]),
  8. program["title"],
  9. program["category"],
  10. str(program["duration"]),
  11. program["url"]
  12. ]) + "\n"
  13. f.write(line)

五、完整实现示例

  1. # 配置参数
  2. API_KEY = "your_api_key"
  3. SECRET = "your_client_secret"
  4. OUTPUT_FILE = "fm_programs.lst"
  5. def main():
  6. # 获取访问令牌
  7. token = get_access_token(API_KEY, SECRET)
  8. # 获取数据(示例:获取分类ID为1001的节目)
  9. raw_data = safe_fetch(token, category_id=1001)
  10. if not raw_data:
  11. return
  12. # 解析数据
  13. programs = parse_program_data(raw_data)
  14. # 生成LST文件
  15. generate_lst_file(programs, OUTPUT_FILE)
  16. print(f"Successfully generated {OUTPUT_FILE} with {len(programs)} records")
  17. if __name__ == "__main__":
  18. main()

六、性能优化建议

  1. 批量请求策略:采用分页查询时,建议每页请求100-200条数据,平衡网络延迟与处理效率
  2. 缓存机制:对频繁访问的分类数据实施本地缓存,减少API调用次数
  3. 异步处理:使用aiohttp库实现并发请求,提升数据获取速度
  4. 增量更新:记录最后更新时间,仅获取新增/修改的节目数据

七、合规使用注意事项

  1. 严格遵守百度FM平台的使用条款,不得用于商业爬虫
  2. 控制请求频率,建议间隔1-2秒/次
  3. 妥善保管API Key和Secret,避免泄露
  4. 定期检查接口变更,及时调整调用参数

通过本文介绍的完整流程,开发者可以高效实现百度FM平台的数据抓取与LST文件生成。实际应用中,可根据具体需求扩展字段处理逻辑,如添加音频时长过滤、分类统计等功能。