IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 记录使用python爬取一个音乐网站的歌曲,支持下载 -> 正文阅读

[开发工具]记录使用python爬取一个音乐网站的歌曲,支持下载

开发环境

python3.9.7
pycharm2021.2

代码如下,安装类库,运行代码即可看到效果

import time
import requests
from lxml import etree
import os
import sys

class musci_info(object):
    music_name = ''
    music_url = []
    music_hot = ''

    def __init__(self, name, url, hot):
        self.music_name = name
        self.music_url = url
        self.music_hot = hot

    def __str__(self):
        str = "歌曲名:{}\n歌曲地址:1、{}\t2、{}\t\t热度值:{}".format(self.music_name, self.music_url[0], self.music_url[1],
                                                         self.music_hot)
        return str


class music(object):

    def __init__(self, search_name):
        """
        初始化需要的数据内容
        :param search_name:     需要查找的内容
        """
        self.next_url = ''
        # 数据源
        self.url = "https://www.ytmp3.cn/?search={}".format(search_name)
        # 请求头
        self.header = {
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/92.0.4515.159 Safari/537.36 ",
            "referer": "https://www.ytmp3.cn/down"
        }
        # 歌曲下载的头部地址
        self.head_url = "https://www.ytmp3.cn/"
        # 获取会话
        self.session = requests.session()
        # 设置请求头
        self.session.headers = self.header

    def search_result(self):
        """
        请求地址获取响应
        :return: 响应
        """
        resp = self.session.get(self.url)
        return resp

    def get_music_url(self):
        """
        解析响应内容
        :return: 歌曲下载地址,歌曲热度信息
        """
        result = self.search_result()
        # 将响应转化为html,方便解析
        html = etree.HTML(result.content.decode())
        # 通过xpath解析html获取歌曲地址列表
        els = html.xpath("//div[@class = 'wq_cententser']/div[2]//li[@class='ser_8']/a/@href")
        # 通过xpath获取歌曲热度列表
        els_hot = html.xpath("//div[@class = 'wq_cententser']/div[2]//li[6]/text()")
        # 获取下一页的链接地址
        self.next_url = html.xpath("//a[text()='下一页' and @href != '']/@href")
        return els, els_hot

    def get_final_music_url(self, is_download):
        els, els_hot = self.get_music_url()
        music_num = len(els)
        if music_num <= 0:
            print("查询结果个数为零,三秒后自动关闭程序")
            time.sleep(3)
            exit(8)
        else:
            # 输出搜索结果数
            print("<\t\t\t\t\t搜索结果个数为{}\t\t\t\t\t>\n\n".format(music_num))
        # 定义数组存储歌曲信息
        data_list = []
        while True:
            # 遍历歌曲下载地址列表,并获取索引
            for idx, el in enumerate(els, 0):
                # 拼接歌曲下载页面完整路径
                music_html_url = self.head_url + el
                # 请求歌曲下载页面获取响应
                music_html = self.session.get(music_html_url)
                # 将响应转化为html
                final_html = etree.HTML(music_html.content.decode())

                try:
                    # 从歌曲下载页面获取歌曲名称
                    music_name = final_html.xpath('//h2/text()')[0]
                    # 从歌曲下载页面获取歌曲资源地址
                    music_url = final_html.xpath('//label/input/@value')
                except IndexError:
                    print("获取信息失败,跳过当前歌曲信息获取,查找下一首...")
                    continue
                # 判断路径是否为mp4文件,如果不为MP4则执行以下代码
                if music_url[0].find('.mp4') == -1 and music_url[1].find('.mp4') == -1:
                    # 创建歌曲对象基本信息
                    m_info = musci_info(music_name, music_url, els_hot[idx])
                    try:
                        # 请求资源地址,下载MP3文件
                        r = self.session.get(music_url[0])
                    except Exception:
                        print("歌曲【{}】资源不存在,跳过该歌曲".format(m_info.music_name))
                        continue
                    if is_download == 'y':
                        filename = 'music_downloads/{}.mp3'.format(music_name)
                        filename_path = 'music_downloads'
                        # 判断目录是否存在,如不存在则创建
                        if not os.path.exists(filename_path):
                            os.makedirs(filename_path)
                        # 将资源文件输出到对应文件
                        with open(filename, 'wb') as f:
                            f.write(r.content)
                    print(m_info)
                    # 歌曲对象添加到歌曲对象数组
                    data_list.append(m_info)
            # 判断当前搜索结果是否有下一页
            if self.next_url:
                # 获取控制到接受信息
                is_next = input("下一页(Y/N)?\n").lower()
                if is_next == 'y':
                    self.url = self.head_url + self.next_url[0]
                    els, els_hot = self.get_music_url()
                else:
                    print("程序停止")
                    return data_list
            # 如果没有下一页则停止程序,返回对象数组
            else:
                print("当前已在最后一页,程序结束")
                return data_list
if __name__ == '__main__':
    if len(sys.argv) == 3:
        search_info = sys.argv[1]
        is_download = sys.argv[2]
        # res = music("许嵩").get_final_music_url()
    else:
        search_info = input("请输入需要搜索的内容:\n")
        is_download = input("是否同步下载歌曲到同级目录music_downloads下(Y/N):").lower()
    if is_download == 'y':
        idw = ''
    else:
        idw = '不'
    print("你搜索的内容为:{}\t\t{}同步下载歌曲\n".format(search_info, idw))
    res = music(search_info).get_final_music_url(is_download)


打包

或者可以直接打包成exe可执行文件
命令:pyinstaller -F python文件路径

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 12:11:26  更:2021-10-17 12:13:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:03:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码