Python 音乐爬虫实战:从网页抓包到歌曲下载
在数字音乐的世界里,通过编程的方式获取自己喜欢的音乐,是一件既有趣又充满挑战的事情。今天,我们就用 Python 来打造一个简单的音乐爬虫,实现从网页抓包分析,到最终下载歌曲的全过程。
一、代码概览
流程


先来看一下完整的 Python 代码:
|
import os #抓包过滤媒体 # id # EltfAyJRBlZeEF1aUCQFAFhfFF8NUnheUVhfF11XUyQaVldTR19NVndTVVlSQ1hfVw== #通过上面的参数(id)再抓包,请求 #https://www.gequbao.com/music/39466 歌曲播放页 #https://www.gequbao.com/api/play-url 歌曲链接数据包 import requests import json import re from bs4 import BeautifulSoup os.makedirs('音乐', exist_ok=True) url="https://www.gequbao.com/music/39466 " headers = { "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" } response = requests.get(url,headers=headers) html = response.text # print(html) match= re.search(r'"play_id":"(.*?)"', html) print(match) play_id = match.group(1) # print(play_id) link='https://www.gequbao.com/api/play-url' data = { 'id':play_id, } response = requests.post(url=link,headers=headers,data=data) # print(response.json()) json_data = response.json() print(json_data) gequ_url=json_data['data']['url'] print(gequ_url) mussic=requests.get(gequ_url,headers=headers).content with open(f'音乐/{1}'+'.mp3','wb') as f: f.write(mussic) |
二、代码逐行解析
- 导入必要的库
|
import os import requests import json import re from bs4 import BeautifulSoup |
os库用于处理文件和目录,比如创建保存音乐的文件夹;requests库负责发送 HTTP 请求,获取网页和数据;json库用来解析从服务器返回的 JSON 格式数据;re库提供正则表达式功能,用于在网页文本中提取特定信息;BeautifulSoup库则用于解析 HTML 文档,不过在这段代码中它并没有实际被使用到。
- 创建保存目录
|
os.makedirs('音乐', exist_ok=True) |
使用os.makedirs函数创建名为 “音乐” 的文件夹,如果该文件夹已经存在,exist_ok=True参数可以确保不会抛出异常。
- 设置请求头
|
headers = { "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" } |
通过设置user-agent,我们模拟浏览器向网站发送请求,伪装成正常的用户访问,避免被网站识别为爬虫而拒绝访问。
- 获取歌曲播放页内容
|
url="https://www.gequbao.com/music/39466 " response = requests.get(url,headers=headers) html = response.text |
指定歌曲播放页的 URL,使用requests.get方法发送 GET 请求获取网页内容,并将返回的文本内容存储在html变量中。
- 提取关键参数 play_id
|
match= re.search(r'"play_id":"(.*?)"', html) play_id = match.group(1) |
利用正则表达式,在获取到的网页文本html中搜索play_id字段,并提取其对应的值,这个play_id是后续获取歌曲真实下载链接的关键参数。
- 获取歌曲链接数据包
|
link='https://www.gequbao.com/api/play-url' data = { 'id':play_id, } response = requests.post(url=link,headers=headers,data=data) |
构建请求歌曲链接数据包的 URL 和请求数据,将之前获取到的play_id作为参数,通过requests.post方法发送 POST 请求,获取包含歌曲真实下载链接的 JSON 数据。
- 解析数据并获取歌曲下载链接
|
json_data = response.json() gequ_url=json_data['data']['url'] |
将获取到的响应数据解析为 JSON 格式,从解析后的 JSON 数据中提取出歌曲的真实下载链接gequ_url。
- 下载歌曲
|
mussic=requests.get(gequ_url,headers=headers).content with open(f'音乐/{1}'+'.mp3','wb') as f: f.write(mussic) |
使用requests.get方法获取歌曲链接的内容,以二进制写入模式打开本地文件,将获取到的歌曲内容写入文件,完成歌曲下载。
三、可能存在的问题与注意事项
- 版权问题:通过爬虫下载音乐可能涉及侵犯版权,本代码仅用于技术学习和交流,请勿用于非法的商业用途或未经授权的资源获取。
- 网站反爬策略:网站可能会不断更新反爬机制,比如对请求频率进行限制、增加验证码验证等,当前的简单请求头伪装可能在未来无法正常获取数据。
- 代码健壮性:代码中缺少错误处理机制,比如在请求失败、数据解析失败等情况下没有相应的应对措施,可能导致程序崩溃。同时,下载的文件名固定为1.mp3,如果多次运行下载不同歌曲,会导致文件被覆盖。
希望通过这篇博客,你能对 Python 音乐爬虫的实现过程有更清晰的了解。在实际应用中,不断探索和优化代码,让它变得更加完善和强大!如果你在实践过程中遇到任何问题,欢迎在评论区交流分享。
更多推荐
所有评论(0)