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

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

需求分析:

  • 网站:邓紫棋-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 requestsheaders = {"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)# 歌曲idplay_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 osinp = 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)# 下载歌曲的链接 需要传入每个歌曲的idlink = '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 osinp = 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)# 以上代码拿到idurl = 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).contentfiled_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.rhkb.cn/news/667.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 如何传参xml调用接口获取数据

传参和返参的效果图如下: 传参: 返参: 代码实现: 1、最外层类 /*** 外层DATA类*/ XmlRootElement(name "DATA") public class PointsXmlData {private int rltFlag;private int failType;private String failMemo;p…

java项目之在线文档管理系统源码(springboot+mysql+vue+文档)

大家好我是风歌,曾担任某大厂java架构师,如今专注java毕设领域。今天要和大家聊的是一款基于springboot的在线文档管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 在线文档管理系统的主要使用者分为管…

学技术步骤,(tomcat举例)jar包api手写tomcat静态资源基础服务器

1.看有哪些包,能用本地离线的包就使用离线包 2.尽量不要使用配置文件(先不用),能用api就用api, 因为配置文件只是文本,其实要的只是配置文件里的参数, 这些参数最后肯定还是要给到这些api去处…

React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode

【2024最新版】React18 核心源码分析教程(全61集) Element对象与Fiber对象 在 React 中,Element 对象 和 Fiber 对象 是核心概念,用于实现 React 的高效渲染和更新机制。以下是它们的详细解读: 1. Element 对象 定…

如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦

一、问题背景 自OceanBase 4.3.0版本起,支持了列存引擎,允许表和索引以行存、纯列存或行列冗余的形式创建,且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外,也有用户询问如何通过SQL语句…

超完整Docker学习记录,Docker常用命令详解

前言 关于国内拉取不到docker镜像的问题,可以利用Github Action将需要的镜像转存到阿里云私有仓库,然后再通过阿里云私有仓库去拉取就可以了。 参考项目地址:使用Github Action将国外的Docker镜像转存到阿里云私有仓库 一、Docker简介 Do…

数据结构-排序课后题

今天我们来简单的说说关于排序的一些课后练习题. 对应的知识点博客: LINK. 目录 1. 每一单趟都能确定一个数字的最终位置的排序2. 根据序列变化确定排序方式3. 排序顺序对哪些排序效率影响不大?4. 对有序序列排序最费力的排序方式是什么?5. 对接近有序序列排序最快的排序方式…

MySQL 架构

MySQL架构 MySQL8.0服务器是由连接池、服务管理⼯具和公共组件、NoSQL接⼝、SQL接⼝、解析器、优化 器、缓存、存储引擎、⽂件系统组成。MySQL还为各种编程语⾔提供了⼀套⽤于外部程序访问服务器的连接器。整体架构图如下所⽰: MySQL Connectors:为使⽤…

【数据结构】二叉搜索树

目录 1. 二叉搜索树的概念 2. 二叉搜索树的性能分析 3.二叉搜索树的实现 3. 1.二叉搜索树的插入 3.2. 二叉搜索树的查找 3.3. 二叉搜索树的删除 3.4. 二叉搜索树的实现代码 4. 二叉搜索树key和key/value两种使用场景 4.1 key搜索场景: 4.2 key/value搜索场…

【C++】string的关系运算与比较分析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯基础知识:C 中的 string 关系运算器1. 关系运算器概述2. 字符串比较的本质 💯代码解析与扩展代码例一:相等比较代码解析输出 代码例二&a…

高性能网络模式:Reactor 和 Proactor

Reactor Reactor 采用I/O多路复用监听事件,收到事件后,根据事件类型分配给某个进程/线程。 实际应用中用到的模型: 单 Reactor 单进程 单 Reactor 多线程 优点:能充分利用多核CPU性能。 缺点:存在多线程竞争共享资源…

有限元分析学习——Anasys Workbanch第一阶段笔记(10)桌子载荷案例分析_实际载荷与均布载荷的对比

目录 0 序言 1 桌子案例 2 模型简化 3 方案A 前处理 1)分析类型选择 2)材料加载 3)约束、载荷及接触 4)控制网格(网格大小需要根据结果不断调整) 初始计算结果 加密后计算结果 4 方案B、C 前处理 1)分析…

用HTML + CSS实现太极图

目录 一、效果图 二、实现思路 三、完整代码 四、总结 一、效果图 如图所示,太极图一半为黑色(代表阴),另一半为白色(代表阳)。这两部分相互环绕,形成一种流动的、旋转的感觉。 二、实现思…

【Rust自学】11.7. 按测试的名称运行测试

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.7.1. 按名称运行测试的子集 如果想要选择运行的测试,就将测试的名称(一个或多个)作为cargo test的…

标准应用 | 2025年网络安全服务成本度量实施参考

01 网络安全服务成本度量依据相关新变化 为了解决我国网络安全服务产业发展中面临的服务供需两方对于服务成本组成认知偏差较大、网络安全服务成本度量缺乏依据的问题,中国网络安全产业联盟(CCIA)组织北京赛西科技发展有限责任公司、北京安…

HAMi + prometheus-k8s + grafana实现vgpu虚拟化监控

最近长沙跑了半个多月,跟甲方客户对了下项目指标,许久没更新 回来后继续研究如何实现 grafana实现HAMi vgpu虚拟化监控,毕竟合同里写了需要体现gpu资源限制和算力共享以及体现算力卡资源共享监控 先说下为啥要用HAMi吧, 一个重要原…

某地武警海警总队建筑物自动化监测

1. 项目概述 该项目分布于三个不同的地级市,都是位于临海港口的码头,由中国武警海警总队驻扎,守卫人民安全。 1号建筑物自动化监测系统项目由一道伸缩缝划分为两个监测单元,建筑物为三层混合结构,采用350mm厚石墙、2…

负载均衡原理及算法

什么是负载均衡? 负载均衡 指的是将用户请求分摊到不同的服务器上处理,以提高系统整体的并发处理能力以及可靠性。负载均衡服务可以有由专门的软件或者硬件来完成,一般情况下,硬件的性能更好,软件的价格更便宜&#x…

Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(初版)Linux 下Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(重置版)Windows …

LLMs之VDB:LanceDB的简介、安装和使用方法、案例应用之详细攻略

LLMs之VDB:LanceDB的简介、安装和使用方法、案例应用之详细攻略 目录 LanceDB的简介 1、LanceDB的主要特性 2、为何选择 LanceDB? LanceDB的安装和使用方法 1、安装方法 Javascript/Typescript Python 2、使用方法 Javascript Python LanceDB…