Python 音乐爬虫实战:从网页抓包到歌曲下载

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

一、代码概览

流程

Python 音乐爬虫实战:从网页抓包到歌曲下载_第1张图片

Python 音乐爬虫实战:从网页抓包到歌曲下载_第2张图片

先来看一下完整的 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)

二、代码逐行解析

  1. 导入必要的库

import os

import requests

import json

import re

from bs4 import BeautifulSoup

os库用于处理文件和目录,比如创建保存音乐的文件夹;requests库负责发送 HTTP 请求,获取网页和数据;json库用来解析从服务器返回的 JSON 格式数据;re库提供正则表达式功能,用于在网页文本中提取特定信息;BeautifulSoup库则用于解析 HTML 文档,不过在这段代码中它并没有实际被使用到。

  1. 创建保存目录

os.makedirs('音乐', exist_ok=True)

使用os.makedirs函数创建名为 “音乐” 的文件夹,如果该文件夹已经存在,exist_ok=True参数可以确保不会抛出异常。

  1. 设置请求头

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,我们模拟浏览器向网站发送请求,伪装成正常的用户访问,避免被网站识别为爬虫而拒绝访问。

  1. 获取歌曲播放页内容

url="https://www.gequbao.com/music/39466 "

response = requests.get(url,headers=headers)

html = response.text

指定歌曲播放页的 URL,使用requests.get方法发送 GET 请求获取网页内容,并将返回的文本内容存储在html变量中。

  1. 提取关键参数 play_id

match= re.search(r'"play_id":"(.*?)"', html)

play_id = match.group(1)

利用正则表达式,在获取到的网页文本html中搜索play_id字段,并提取其对应的值,这个play_id是后续获取歌曲真实下载链接的关键参数。

  1. 获取歌曲链接数据包

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 数据。

  1. 解析数据并获取歌曲下载链接

json_data = response.json()

gequ_url=json_data['data']['url']

将获取到的响应数据解析为 JSON 格式,从解析后的 JSON 数据中提取出歌曲的真实下载链接gequ_url

  1. 下载歌曲

mussic=requests.get(gequ_url,headers=headers).content

with open(f'音乐/{1}'+'.mp3','wb') as f:

    f.write(mussic)

使用requests.get方法获取歌曲链接的内容,以二进制写入模式打开本地文件,将获取到的歌曲内容写入文件,完成歌曲下载。

三、可能存在的问题与注意事项

  1. 版权问题:通过爬虫下载音乐可能涉及侵犯版权,本代码仅用于技术学习和交流,请勿用于非法的商业用途或未经授权的资源获取。
  2. 网站反爬策略:网站可能会不断更新反爬机制,比如对请求频率进行限制、增加验证码验证等,当前的简单请求头伪装可能在未来无法正常获取数据。
  3. 代码健壮性:代码中缺少错误处理机制,比如在请求失败、数据解析失败等情况下没有相应的应对措施,可能导致程序崩溃。同时,下载的文件名固定为1.mp3,如果多次运行下载不同歌曲,会导致文件被覆盖。

希望通过这篇博客,你能对 Python 音乐爬虫的实现过程有更清晰的了解。在实际应用中,不断探索和优化代码,让它变得更加完善和强大!如果你在实践过程中遇到任何问题,欢迎在评论区交流分享。

你可能感兴趣的:(python,爬虫,开发语言)