爬虫——爬取小音乐网站

爬虫有几部分功能???
    1.发请求,获得网页源码 #1.和2是在一步的 发请求成功了之后就能直接获得网页源码
    2.解析我们想要的数据
    3.按照需求保存 

注意:开始爬虫前,需要给其封装

c345ba9c6b774d94b1eae4a97558814a.png

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
}

爬虫分析:

第一步:从列表页抓取详情页面的链接

67a22993e4b548dab264c312cc472003.png

正则表达式:

<li\sclass="media\sthread\stap\s\s".*?>.*?<div\sclass="subject\sbreak-all">.*?<a\shref="(.*?)">(.*?)</a>

得到如下结果

3cf2dab9b1104a35932bc4ce910ba80c.png

从以上结果可以看出,此链接不可直接点击,缺少https://www.hifini.com/这一部分

https://www.hifini.com/thread-20945.htm

因此如下处理

   for i in result:
        # print(i)#元祖下标取值
        href = "https://www.hifini.com/"+i[0]
        name = i[1]
        print(href)
        print(name)
        print('======================')

c25d12de58394e50a8ae10c476cad5a4.png

第二步:获取歌曲播放资源

找到歌曲url的xpath:

music:\s\[.*?title:\s'(.*?)',.*?url:\s'(.*?)'

代码:

#解析歌曲的播放组员
song_re = "music:\s\[.*?title:\s'(.*?)',.*?url:\s'(.*?)'"
r = re.findall(song_re,song_html_data,re.S)
# print('歌曲信息',r)
for i in r:
    song_name = i[0]
    song_link = "https://www.hifini.com/"+i[1]
    print('歌名:',song_name)
    print("歌曲播放资源链接",song_link)
    print('++++++++++++++++')

9ef65f579d2d405daf4d544469d24d13.png

第三步:再次像歌曲播放资源链接发请求 获得二进制数据,进行保存

1.创建文件夹

#保存歌曲 先创建一个文件夹 导入os模块
#判断文件是否存在
if not os.path.exists('歌曲'):
    os.makedirs("歌曲")

2.创建文件流,将歌曲保存在文件夹中

with open('歌曲\{}.m4a'.format(song_name),'wb')as f:
    f.write(data_bytes)

代码:

import requests
import re
import os

shouye_url = 'https://www.hifini.com/'
# 1.起始目标
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
}
response = requests.get(shouye_url, headers=headers)
#1.发请求,获得网页源码
def get_data(url):
    response = requests.get(url,headers=headers)
    # print(response.status_code)
    # print(response.text)
    if response.status_code == 200:
        return response.text
#2.解析我们想要的数据
def parse_data(data):#形参站位 模拟的就是爬虫爬取下来的源码
    z ='<li\sclass="media\sthread\stap\s\s".*?>.*?<div\sclass="subject\sbreak-all">.*?<a\shref="(.*?)">(.*?)</a>'
    result = re.findall(z,data,re.S)
    # print(result)
    # https://www.hifini.com/thread-20945.htm
    for i in result:
        # print(i)#元祖下标取值
        href = "https://www.hifini.com/"+i[0]
        name = i[1]
        print(href)
        print(name)
        print('======================')
        get_song_link(href)
        #https://www.hifini.com/get_music.php?key=2Ydoqazb8E6jj+Nvl6rZLnuh3Fu1MRARle/srx5zQfZVMkPqsGrSzFHehon89oIENCUU19ru3GEJax60Ew
# 像详情页发请求 获得网页源码
def get_song_link(link):#link模拟的是详情页的url
    song_html_data = get_data(link)
    # print("详情页的网页源码",song_html_data)
    #解析歌曲的播放组员
    song_re = "music:\s\[.*?title:\s'(.*?)',.*?url:\s'(.*?)'"
    r = re.findall(song_re,song_html_data,re.S)
    # print('歌曲信息',r)
    for i in r:
        song_name = i[0]
        song_link = "https://www.hifini.com/"+i[1]
        print('歌名:',song_name)
        print("歌曲播放资源链接",song_link)
        print('++++++++++++++++')
        #再次像歌曲播放资源链接发请求 获得二进制数据
        data_bytes = requests.get(song_link,headers=headers).content
        # print(data_bytes)
        #保存歌曲 先创建一个文件夹 导入os模块
        #判断文件是否存在
        if not os.path.exists('歌曲'):
            os.makedirs("歌曲")
        with open('歌曲\{}.m4a'.format(song_name),'wb')as f:
            f.write(data_bytes)
#对应的功能写在不同的函数里面 如果需要互用功能 互相调用即可
if __name__ == '__main__':
    h = get_data(shouye_url)
    parse_data(h)

结果:

5848239ec78742f48e0a71d1b0b5d214.png

8bb2da505c6247f4b647d0ba40b35165.png

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络(十) —— IP协议详解,理解运营商和全球网络

目录 一&#xff0c;关于IP 1.1 什么是IP协议 1.2 前置认识 二&#xff0c;IP报头字段详解 三&#xff0c;网段划分 3.1 IP地址的构成 3.2 网段划分 3.3 子网划分 3.4 IP地址不足问题 四&#xff0c;公网IP和私有IP 五&#xff0c;理解运营商和全球网络 六&#xff…

openpnp - 底部相机高级校正的参数设置

文章目录 openpnp - 底部相机高级校正的参数设置概述笔记修改 “Radial Lines Per Calibration Z” 的方法不同 “Radial Lines Per Calibration Z”的校验结果不同 “Radial Lines Per Calibration Z”的设备校验动作的比较总结备注END openpnp - 底部相机高级校正的参数设置 …

学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)

在线学籍管理平台系统 目录 基于SpringbootVUE的在线学籍管理平台系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

Linux·进程概念(下)

1. 进程优先级 优先级就是获得某种资源的先后顺序&#xff0c;因为CPU资源是有限的&#xff0c;因此各个进程之间要去争取CPU的资源。 那么针对Linux操作系统下的PCB中&#xff0c;也就是task_struct结构体中&#xff0c;使用了int类型的变量记录了每个进程的优先级属性&#x…

“米哈游悄然布局未来科技:入股星海图,共绘具身智能机器人新篇章“

米哈游悄然入股具身智能机器人公司:技术布局与未来展望 近日,米哈游阿尔戈科技有限公司宣布入股具身智能机器人公司星海图,这一消息在行业内引起了广泛关注。米哈游,这家以游戏开发而闻名的企业,近年来正逐步扩大其在人工智能和新兴科技领域的投资布局,此次入股星海图正是…

数组指针和指针数组

引用&#xff1a;【数组指针】 仅此一篇 让你深刻理解数组指针-CSDN博客 b站&#xff1a;【动画讲解C语言指针-14-数组指针和指针数组】 https://www.bilibili.com/video/BV1Qj421U75U/?share_sourcecopy_web&vd_sourced59dcee6044af8fc880b46b581c3f58a 指向数组和指向…

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT JetBrains2024&#xff08;IntelliJ IDEA、PhpStorm、RubyMine、Rider……&#xff09;安装包Anaconda Miniconda安装.condarc 文件配置镜像源查看conda的配置和源(channel)自定义conda虚拟环境路径conda常用命…

双指针:滑动窗口

题目描述 给定两个字符串 S 和 T&#xff0c;求 S 中包含 T 所有字符的最短连续子字符串的长度&#xff0c;同时要求时间复杂度不得超过 O(n)。 输入输出样例 输入是两个字符串 S 和 T&#xff0c;输出是一个 S 字符串的子串。样例如下&#xff1a; 在这个样例中&#xff0c…

在树莓派上部署开源监控系统 ZoneMinder

原文&#xff1a;https://blog.iyatt.com/?p17425 前言 自己搭建&#xff0c;可以用手里已有的设备&#xff0c;不需要额外买。这套系统的源码是公开的&#xff0c;录像数据也掌握在自己手里&#xff0c;不经过不可控的三方。 支持设置访问账号 可以保存录像&#xff0c;启…

C++中,如何使你设计的迭代器被标准算法库所支持。

iterator&#xff08;读写迭代器&#xff09; const_iterator&#xff08;只读迭代器&#xff09; reverse_iterator&#xff08;反向读写迭代器&#xff09; const_reverse_iterator&#xff08;反向只读迭代器&#xff09; 以经常介绍的_DList类为例&#xff0c;它的迭代…

QT--基础

将默认提供的程序都注释上意义 0101.pro QT core gui #QT表示要引入的类库 core&#xff1a;核心库 gui&#xff1a;图形化界面库 #如果要使用其他库类中的相关函数&#xff0c;则需要加对应的库类后&#xff0c;才能使用 greaterThan(QT_MAJOR_VERSION, 4): QT wid…

算法: 二分查找题目练习

文章目录 二分查找二分查找在排序数组中查找元素的第一个和最后一个位置搜索插入位置x 的平方根山脉数组的峰顶索引寻找峰值寻找旋转排序数组中的最小值点名 总结精华模版 二分查找 二分查找 没啥可说的,轻轻松松~ class Solution {public int search(int[] nums, int target…

栈的介绍与实现

一. 概念与结构 栈&#xff1a;⼀种特殊的线性表&#xff0c;其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶&#xff0c;另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out的原则。 压栈&#xff1a;栈的插…

二叉树进阶学习——从前序和中序遍历序列构造二叉树

1.题目解析 题目来源&#xff1a;105.从前序与中序遍历序列构造二叉树——力扣 测试用例 2.算法原理 首先要了解一个概念 前序遍历&#xff1a;按照 根节点->左子树->右子树的顺序遍历二叉树 中序遍历&#xff1a;按照 左子树->根节点->右子树的顺序遍历二叉树 题目…

在 Kali Linux 中安装 Impacket

步骤 1&#xff1a;更新系统 打开终端并确保你的系统是最新的&#xff1a; sudo apt update && sudo apt upgrade -y 步骤 2&#xff1a;安装依赖 在安装 Impacket 之前&#xff0c;你需要确保安装了 Python 和一些必要的依赖。通常&#xff0c;Kali 已经预装了 Pytho…

影刀RPA实战:Excel拆分与合并工作表

1.影刀操作excel的优势 Excel&#xff0c;大家都不陌生&#xff0c;它是微软公司推出的一款电子表格软件&#xff0c;它是 Microsoft Office 套件的一部分。Excel 以其强大的数据处理、分析和可视化功能而闻名&#xff0c;广泛应用于商业、教育、科研等领域。可以说&#xff0…

YOLO11改进|注意力机制篇|引入ELA注意力机制

目录 一、【ELA】注意力机制1.1【ELA】注意力介绍1.2【ELA】核心代码 二、添加【ELA】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【ELA】注意力机制 1.1【ELA】注意力介绍 这篇论文的作者通过分析Coordinate Attention(C…

Java Supplier和Consumer接口

Supplier 在Java中&#xff0c;Supplier接口是一个重要的函数式接口&#xff0c;它属于java.util.function包&#xff0c;Supplier通常用于延迟计算或生成值的场景。Supplier接口是一个泛型接口&#xff0c;其get()方法不接受任何参数但返回一个泛型类型T的值。 这个接口被注解…

STM32新建工程-基于库函数

目录 一、创建一个新工程 二、为工程添加文件和路径 三、创建一个main.c文件&#xff0c;并调试 四、修改一些配置 五、用库函数进行写程序 1、首先加入一些库函数和头文件 2、编写库函数程序 一、创建一个新工程 我这里选择STM32F103C8的型号&#xff0c;然后点击OK。 …

Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境

下载 官方网站&#xff1a;http://maven.apache.org/ 下载页面&#xff1a;http://maven.apache.org/download.cgi 官网 下载页面 注&#xff1a;本教程使用的是3.3.9版本的maven。 安装 maven安装包下载完成后是一个压缩文件&#xff0c;如下图所示&#xff1a; 我们需要将…