Python 网络爬虫实战:使用 Requests 抓取音乐数据教程
本文介绍了使用 Python 和 Requests 库进行网络爬虫开发的基础教程。内容涵盖环境配置、HTTP 请求发送、JSON 数据解析、PrettyTable 表格输出以及文件流下载的具体实现。文章详细解析了请求头设置、URL 编码、异常处理等关键技术点,并提供了完整的搜索与下载代码示例。同时强调了遵守法律法规及网站协议的重要性,适合初学者学习 Web 数据采集的基本逻辑。

本文介绍了使用 Python 和 Requests 库进行网络爬虫开发的基础教程。内容涵盖环境配置、HTTP 请求发送、JSON 数据解析、PrettyTable 表格输出以及文件流下载的具体实现。文章详细解析了请求头设置、URL 编码、异常处理等关键技术点,并提供了完整的搜索与下载代码示例。同时强调了遵守法律法规及网站协议的重要性,适合初学者学习 Web 数据采集的基本逻辑。

网络爬虫(Web Crawler)是自动化获取网页信息的技术。在数据分析、信息聚合等场景中,通过 Python 的 requests 库可以高效地模拟浏览器行为,获取目标网站的数据。本文将以音乐搜索与下载为例,演示如何使用 Python 发送 HTTP 请求、解析 JSON 数据并处理文件流。
注意:本教程仅用于技术学习与研究。在实际应用中,请遵守相关法律法规及目标网站的 robots.txt 协议,尊重版权,不要用于非法用途。
requests:用于发送 HTTP 请求prettytable:用于格式化输出表格安装依赖命令:
pip install requests prettytable
实现音乐搜索与下载功能主要分为两个步骤:
首先定义搜索逻辑,包括设置请求头(Headers)以伪装浏览器身份,避免被服务器拦截。
from urllib.parse import quote
import requests
import prettytable as pt
# 用户输入搜索关键词
search_key = input('请输入你要搜索的歌曲或歌手名:')
# 对关键词进行 URL 编码,防止特殊字符导致请求错误
search_key = quote(search_key)
# 设置请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36',
# 注意:实际 Cookie 可能随时间失效,建议动态获取或使用 Session
'Cookie': '_ga=GA1.2.1829952759.1632831324; BusinessId={...}; kw_token=SK7FZCBITOJ'
}
# 构造搜索接口 URL
url = f'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key={search_key}&pn=1&rn=30'
try:
response = requests.get(url=url, headers=headers, timeout=10)
if response.status_code == 200:
json_data = response.json()
data_list = json_data['data']['list']
else:
print(f'请求失败,状态码:{response.status_code}')
exit()
except Exception as e:
print(f'发生异常:{e}')
exit()
# 使用 PrettyTable 格式化输出结果
tb = pt.PrettyTable()
tb.field_names = ['序号', '歌名', '歌手', '专辑']
count = 0
info_list = []
for data in data_list:
rid = data['rid']
name = data['name']
artist = data['artist']
album = data['album']
tb.add_row([count, name, artist, album])
info_list.append([rid, name, artist])
count += 1
print(tb)
根据用户选择的序号,获取对应的歌曲 ID,调用播放接口获取下载地址,最后写入本地文件。
while True:
try:
input_index = int(input("请输入与你要下载歌曲的序号 (-1 退出):"))
except ValueError:
print("请输入有效的数字")
continue
if input_index == -1:
break
if 0 <= input_index < len(info_list):
download_info = info_list[input_index]
song_id = download_info[0]
song_name = download_info[1]
singer_name = download_info[2]
# 构造播放接口 URL,br 参数控制音质
play_url = f'http://www.kuwo.cn/api/v1/www/music/playUrl?mid={song_id}&type=convert_url3&br=320kmp3'
try:
resp_play = requests.get(play_url, headers=headers, timeout=10)
music_json = resp_play.json()
music_url = music_json['data']['url']
# 获取音频内容
music_data = requests.get(music_url).content
# 确保目录存在
import os
if not os.path.exists('download'):
os.makedirs('download')
# 保存文件
file_path = f'download/{song_name}-{singer_name}.mp3'
with open(file_path, mode='wb') as f:
f.write(music_data)
print(f'{song_name} 下载完成!路径:{file_path}')
except Exception as e:
print(f'下载失败:{e}')
else:
print("无效的序号")
服务器通常通过检查 User-Agent 来识别客户端。爬虫需要设置合理的 User-Agent 以避免被识别为脚本。此外,部分接口需要携带 Cookie 或 Token 才能访问,这些值通常是动态的,硬编码可能导致请求失败(如 403 Forbidden)。
中文关键词直接拼接 URL 会导致乱码或请求错误。使用 urllib.parse.quote 可以将中文字符转换为百分号编码格式。
网络请求受环境影响较大,必须使用 try-except 捕获超时、连接错误或 JSON 解析异常,保证程序的健壮性。
下载音频时,使用 response.content 获取二进制数据,并以 'wb' (Write Binary) 模式写入文件,确保文件完整性。
通过本教程,我们掌握了使用 Python 进行基础网络爬虫开发的流程。从发送请求到解析数据,再到文件存储,这是构建更复杂数据采集系统的基础。希望读者能在此基础上进一步探索,同时始终遵循法律法规,文明上网。
本文旨在分享编程技术,请勿用于商业用途或侵犯版权。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online