爬虫基础之爬取歌曲宝歌曲批量下载

news2025/3/1 15:32:12

声明:本案列仅供学习交流使用 任何用于非法用途均与本作者无关

需求分析:

  • 网站:邓紫棋-mp3在线免费下载-歌曲宝-找歌就用歌曲宝-MP3音乐高品质在线免费下载 (gequbao.com)        
  • 爬取 歌曲名  歌曲 实现歌手名称下载所有歌曲
     
本案列所使用的模块
requests (发送HTTP请求)re(用于正则表达式匹配和处理)
parsel  (解析HTML或XML文档)os (用于与操作系统进行交互,如文件和目录操作)

监听数据包:

  • 打开开发者工具 F12 or 右击点击检查  点击网络
  • 点击下一页 或者往下滑
  • Ctrl+F 快捷键打开搜索框 输入想要爬取的数据
     

 

分析:
        通过此界面拿到所有歌曲的内页
        然后点进去分析详情页的数据

 点击播放按钮 监听数据包 复制下图的URL 地址到浏览器中打开

       发现就会下载这个音乐文件
       接着点击下载歌曲里面的下载高品质MP3

         找到这个请求的数据包  后续发送请求 通过正则可以将下载链接提取出来

         好的 分析完毕 我们开始写代码

         老样子 右击复制 cURL(bash) 打开我们的爬虫工具
         
爬虫工具库-spidertools.cn      

        复制代码到本地Py文件 
        以下是实现一首歌曲的采集
        发现是根据每首歌的id 来下载的歌曲 因此我们需要拿到所有下载歌曲的id
        在每首歌曲的详情页

# 导包
import re
import requests

headers = {
    "accept": "application/json, text/javascript, */*; q=0.01",
    "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
    "origin": "https://www.gequbao.com",
    "priority": "u=1, i",
    "referer": "https://www.gequbao.com/music/9653",
    "sec-ch-ua": "\"Chromium\";v=\"128\", \"Not;A=Brand\";v=\"24\", \"Microsoft Edge\";v=\"128\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-origin",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
    "x-requested-with": "XMLHttpRequest"
}
cookies = {
    "Hm_lvt_c2b69091f94cb4368f25c28fc7c2d28c": "1736209777,1736210463",
    "HMACCOUNT": "0EB52C16E9A34AE0",
    "Hm_lpvt_c2b69091f94cb4368f25c28fc7c2d28c": "1736210603"
}
url = "https://www.gequbao.com/api/play-url"
data = {
    "id": "SF9bVDxXUl1RQ1heUHJe"
}
response = requests.post(url, headers=headers, cookies=cookies, data=data)
# 通过re正则提取 下载的url地址
down_url = ''.join(re.findall(r'"url":"(.*?)"',response.text)[0]).replace('\\','')
# 保存数据 歌曲 图片 视频  保存均为二进制的格式
content = requests.get(url=down_url, headers=headers, cookies=cookies, data=data).content
# 以二进制的形式 进行写入保存
with open('1.mp3','wb') as f:
    f.write(content)

接着我们拿到所有歌曲的内页链接  里面包含歌曲的id

# 发送请求
first_url = 'https://www.gequbao.com/s/%E9%82%93%E7%B4%AB%E6%A3%8B'
# 后面的参数 其实就是邓紫棋
result= requests.get(url=first_url,headers=headers,cookies=cookies,data=data)
print(result.text)

从返回的数据中搜索是否存在我们想要的数据 

提取数据  打开元素面板 查看元素所在的位置

select = parsel.Selector(result.text)
lis = select.css('.row .col-8.col-content')
for li in lis:
    in_id = li.css('a::attr(href)').get().split('/')[-1]

        接着我们构造URL 对详情页发送请求 

url = f'https://www.gequbao.com/music/{in_id}'

        从返回的数据中通过正则提取我们想要的数据 id

    resp = requests.get(url, headers=headers)
    # print(resp.text)
    # 歌曲id
    play_id = re.findall(r"window.play_id = '(.*?)';", resp.text)[0]
    # 歌曲名字
    play_title = re.findall(r"window.mp3_title = '(.*?)';", resp.text)[0]
    # 歌手
    play_author = re.findall(r"window.mp3_author = '(.*?)';", resp.text)[0]
    # 因为正则提取出来的是列表 对列表进行取值  

        最后 还记得开始下载一首歌曲的请求嘛 对此发送请求 
        将我们从每首歌的详情页获取到的play_id 传进去
        完整的代码如下 

import requests
import re
import parsel
import os


inp = input('请输入要采集的歌手:')
headers = {
    'user-agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0'
}


first_url = f'https://www.gequbao.com/s/{inp}'
# .row   .col-8.col-content a
result = requests.get(url=first_url,headers=headers)
select = parsel.Selector(result.text)
lis = select.css('.row .col-8.col-content')
for li in lis:
    in_id = li.css('a::attr(href)').get().split('/')[-1]
    # print(in_id)
    # 以上代码拿到id
    
    # 构建详情页链接
    url = f'https://www.gequbao.com/music/{in_id}'
    
    resp = requests.get(url, headers=headers)
    # print(resp.text)
    play_id = re.findall(r"window.play_id = '(.*?)';", resp.text)[0]
    play_title = re.findall(r"window.mp3_title = '(.*?)';", resp.text)[0]
    play_author = re.findall(r"window.mp3_author = '(.*?)';", resp.text)[0]
    # print(play_id,play_title,play_author)
    
    # 下载歌曲的链接 需要传入每个歌曲的id
    link = 'https://www.gequbao.com/api/play-url'
    
    data = {
        'id': play_id
    }
    response = requests.post(url=link, data=data, headers=headers)
    json_data = response.json()
    # 获取json数据
    # 提取下载链接
    play_url = json_data['data']['url']
    

最后我们根据不同歌手来保存数据 
        需要导入os 模块

    # 获取二进制数据 
    content = requests.get(play_url, headers=headers).content
    # 定义文件目录
    filed_name=f'music\\{play_author}\\'
    # 自动创建 文件夹
    if not os.path.exists(filed_name):
        os.makedirs(filed_name)    
    # 以二进制的数据写入保存
    with open(f'{filed_name}' + play_author + play_title + '.mp3', 'wb') as f:
        f.write(content)
        print(f'正在采集{play_author}{play_title}歌曲')

         以下是本次案例的所有代码 仅供学习参考使用

import requests
import re
import parsel
import os


inp = input('请输入要采集的歌手:')
headers = {
    'user-agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0'
}


first_url = f'https://www.gequbao.com/s/{inp}'
# .row   .col-8.col-content a
result = requests.get(url=first_url,headers=headers)
select = parsel.Selector(result.text)
lis = select.css('.row .col-8.col-content')
for li in lis:
    in_id = li.css('a::attr(href)').get().split('/')[-1]
    # print(in_id)
    # 以上代码拿到id

    url = f'https://www.gequbao.com/music/{in_id}'

    resp = requests.get(url, headers=headers)
    # print(resp.text)
    play_id = re.findall(r"window.play_id = '(.*?)';", resp.text)[0]
    play_title = re.findall(r"window.mp3_title = '(.*?)';", resp.text)[0]
    play_author = re.findall(r"window.mp3_author = '(.*?)';", resp.text)[0]
    # print(play_id,play_title,play_author)

    link = 'https://www.gequbao.com/api/play-url'

    data = {
        'id': play_id
    }
    response = requests.post(url=link, data=data, headers=headers)
    json_data = response.json()
    play_url = json_data['data']['url']

    content = requests.get(play_url, headers=headers).content
    filed_name=f'music\\{play_author}\\'
    if not os.path.exists(filed_name):
        os.makedirs(filed_name)
    with open(f'{filed_name}' + play_author + play_title + '.mp3', 'wb') as f:
        f.write(content)
        print(f'正在采集{play_author}{play_title}歌曲')


运行代码 

        本次的案例分享就到此结束啦 感谢大家的观看 您的点赞和关注是我更新的动力 

         

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

树莓派-5-GPIO的应用实验之GPIO的编码方式和SDK介绍

文章目录 1 GPIO编码方式1.1 管脚信息1.2 使用场合1.3 I2C总线1.4 SPI总线2 RPI.GPIO2.1 PWM脉冲宽度调制2.2 静态函数2.2.1 函数setmode()2.2.2 函数setup()2.2.3 函数output()2.2.4 函数input()2.2.5 捕捉引脚的电平改变2.2.5.1 函数wait_for_edge()2.2.5.2 函数event_detect…

Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)

章节3基础功能搭建 46.函数作为值三 package cn . itbaizhan . chapter03 // 函数作为值,函数也是个对象 object FunctionToTypeValue { def main ( args : Array [ String ]): Unit { //Student stu new Student() /*val a ()>{"GTJin"…

CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞

漏洞描述 GiveWP 插件中发现了一个严重漏洞,该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777,CVSS 评分为 9.8,表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装,为全球无数捐赠平…

支付宝租赁小程序提升租赁行业效率与用户体验

内容概要 在当今数字化的世界里,支付宝租赁小程序的出现构建了一种新的租赁模式,使得用户在使用过程中体验更加流畅。想象一下,你在寻找租赁服务时,不再需要繁琐的流程和冗长的等待,只需通过手机轻松点击几下&#xf…

关于使用FastGPT 摸索的QA

近期在通过fastGPT,创建一些基于特定业务场景的、相对复杂的Agent智能体应用。 工作流在AI模型的基础上,可以定义业务逻辑,满足输出对话之外的需求。 在最近3个月来的摸索和实践中,一些基于经验的小问题点(自己也常常…

服务器/电脑与代码仓gitlab/github免密连接

git config --global user.name "xxxx" git config --global user.email "xxxxxx163.com" #使用注册GitHub的邮箱 生成对应邮箱的密码对 ssh-keygen -t rsa -b 4096 -C "xxxxxx163.com" 把公钥id_rsa.pub拷贝到github中 Setting----->…

【C语言系列】函数递归

函数递归 一、递归是什么?1.1尾递归 二、递归的限制条件三、递归举例3.1举例一:求n的阶乘3.2举例二:顺序打印一个整数的每一位 四、递归与迭代4.1举例三:求第n个斐波那契数 五、拓展学习青蛙跳台问题 一、递归是什么? …

springboot 默认的 mysql 驱动版本

本案例以 springboot 3.1.12 版本为例 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.12</version><relativePath/> </parent> 点击 spring-…

[QCustomPlot] 交互示例 Interaction Example

本文是官方例子的分析: Interaction Example 推荐笔记: qcustomplot使用教程–基本绘图 推荐笔记: 4.QCustomPlot使用-坐标轴常用属性 官方例子需要用到很多槽函数, 这里先一次性列举, 自行加入到qt的.h中.下面开始从简单的开始一个个分析. void qcustomplot_main_init(void); …

openMetaData docker方式安装部署记录

OpenMetadata一站式元数据管理平台&#xff0c;是一款功能强大的开源元数据管理平台&#xff0c;旨在帮助企业更好地发现、理解和管理其数据资产。它提供了一套全面的工具和功能&#xff0c;涵盖了数据发现、数据血缘、数据质量、数据探查、数据治理和团队协作等多个方面。 那…

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景 实现效果 该案例实现了使用Three.js创建一个带有聚光灯和旋转立方体的3D场景。 知识点 WebGLRenderer&#xff08;WebGL渲染器&#xff09; THREE.WebGLRenderer 是 Three.js 中用于将场景渲染为 WebGL 内容的核…

本地视频进度加入笔记+根据进度快速锁定视频位置

本地视频进度记录快速回溯 引言 在学习的过程中, 如果我们想快速记录当前看视频的位置, 后续回溯查找就会非常方便了。 实现效果 进度记录 通过按下快捷键ctrlaltu&#xff0c; 快速记录当前视频的进度信息,然后复制到typora软件内 快速回溯 在typora软件内, 选中视频索引…

Spring Boot 支持哪些日志框架

Spring Boot 支持多种日志框架&#xff0c;主要包括以下几种&#xff1a; SLF4J (Simple Logging Facade for Java) Logback&#xff08;默认&#xff09;Log4j 2Java Util Logging (JUL) 其中&#xff0c;Spring Boot 默认使用 SLF4J 和 Logback 作为日志框架。如果你需要使…

快速导入请求到postman

1.确定请求&#xff0c;右键复制为cURL(bash) 2.postman菜单栏Import-Raw text&#xff0c;粘贴复制的内容保存&#xff0c;请求添加成功

Golang的网络流量分配策略

## 1. Golang中的网络流量分配策略 简介 在Golang中&#xff0c;网络流量分配策略是指如何有效地管理和优化网络请求的分配&#xff0c;以提高系统的性能和稳定性。优秀的网络流量分配策略能够使系统更好地应对高并发和大流量的情况&#xff0c;同时有效地避免网络拥堵和性能瓶…

【硬件介绍】Type-C接口详解

一、Type-C接口概述 Type-C接口特点&#xff1a;以其独特的扁头设计和无需区分正反两面的便捷性而广受欢迎。这种设计大大提高了用户的使用体验&#xff0c;避免了传统USB接口需要多次尝试才能正确插入的问题。Type-C接口内部结构&#xff1a;内部上下两排引脚的设计虽然可能不…

二、BIO、NIO编程与直接内存、零拷贝

一、网络通信 1、什么是socket&#xff1f; Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;它是一组接口&#xff0c;一般由操作 系统提供。客户端连接上一个服务端&#xff0c;就会在客户端中产生一个 socket 接口实例&#xff0c;服务端每接受 一个客户端…

Android车机DIY开发之软件篇(九)默认应用和服务修改

Android车机DIY开发之软件篇(九)默认应用和服务修改 默认应用位置 ~/packages/apps/Car 增加APP 1.增加 XXXX.app 和Android.mk 2. 修改~/build/make/target/product/handheld_system_ext.mk 默认服务位置 ~/frameworks/base/services/java/com/android/server 查看服务列…

【Rust】错误处理机制

目录 思维导图 引言 一、错误处理的重要性 1.1 软件中的错误普遍存在 1.2 编译时错误处理要求 二、错误的分类 2.1 可恢复错误&#xff08;Recoverable Errors&#xff09; 2.2 不可恢复错误&#xff08;Unrecoverable Errors&#xff09; 三、Rust 的错误处理机制 3…

DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议

文章目录 Pre概述业务流程需求分析的困境统一语言建模事件风暴会议什么是事件风暴&#xff08;Event Storming&#xff09;事件风暴会议 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对…