爬虫——爬取小音乐网站

news/2024/10/4 9:56:20 标签: 爬虫

爬虫有几部分功能???
    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

 


http://www.niftyadmin.cn/n/5689800.html

相关文章

高级java每日一道面试题-2024年10月1日-服务器篇[Redis篇]-Redis数据结构压缩列表和跳跃表的区别?

如果有遗漏,评论区告诉我进行补充 面试官: Redis数据结构压缩列表和跳跃表的区别&#xff1f; 我回答: 关于Redis数据结构的理解是一个重要的考察点&#xff0c;特别是压缩列表&#xff08;ziplist&#xff09;和跳跃表&#xff08;skiplist&#xff09;这两种数据结构&…

Leetcode: 0041-0050题速览

Leetcode: 0041-0050题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 遵从开源协议为知识共享 版权归属-相同方式…

Angular 客户端渲染时,从 ng-state 里读取 SSR 状态的具体逻辑

Angular 在客户端启动时&#xff0c;如何检测页面中的 ng-state 标签并从中读取 JSON 对象&#xff0c;进而还原应用的状态&#xff0c;是服务器端渲染&#xff08;SSR&#xff09;与客户端渲染&#xff08;CSR&#xff09;无缝衔接的核心环节之一。为了理解这个过程&#xff0…

负载均衡可以在网络模型的哪一层?

一、网络模型概述 网络模型是用于描述网络通信过程和网络服务的抽象框架。最常见的网络模型有两种&#xff1a;OSI&#xff08;开放式系统互联&#xff09;模型和TCP/IP模型。 OSI模型 OSI&#xff08;Open Systems Interconnection&#xff09;模型是由国际标准化组织&…

python-斐波那契词序列/最大回文乘积/求最大最小k个元素

一:斐波那契词序列题目描述 编写一个程序&#xff0c;生成斐波那契词序列的前n个元素。 斐波那契词序列是一个词序列&#xff0c;其中每个词是通过连接前两个词形成的。 它以斐波那契序列命名&#xff0c;因为它是以类似的方式创建的&#xff0c;但是我们不是加数字&#xff0c…

探索聚丙烯酸水凝胶,从制备到特性,再到3D打印实践

大家好&#xff01;今天我们来了解一种基于聚丙烯酸的自修复水凝胶——《Preparation and Characterization of Poly(Acrylic Acid)-Based Self-Healing Hydrogel for 3D Shape Fabrication via Extrusion-Based 3D Printing》发表于《Materials》。在材料科学领域&#xff0c;…

Vue3小兔鲜——二级分类页

整体业务认识和路由配置 1. 准备组件模版 <script setup></script><template><div class"container "><!-- 面包屑 --><div class"bread-container"><el-breadcrumb separator">"><el-breadc…

深度学习Day-35:One-hot独热编码

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 一、 独热编码原理 独热编码&#xff08;One-Hot Encoding&#xff09;是一种将分类数据转换为二进制向量的方法&#…