python爬虫基础知识-批量下载音乐

  @全体成员:提供据体图布局和源代码供大家参考,如有不理解的地方可以下载压缩包体验。
  个人原创,仅供参考。
  部分代码参考:https://blog.csdn.net/qq_41445357/article/details/104335529
  **pyton 批量下载音乐:**
  下载链接:https://download.csdn.net/download/ganyonjie/12558189 欢迎下载
  **C# 通用登录UI详细版:**
  下载链接:https://download.csdn.net/download/ganyonjie/11431098 欢迎下载
  **C++版贪吃蛇:**
  下载链接:https://download.csdn.net/download/ganyonjie/11431277 欢迎下载
使用python爬虫爬取图片:

访问连接:https://blog.csdn.net/ganyonjie/article/details/106979440 欢迎访问

爬虫运行完成后目录结构图:


1.运行此程序需要一个Music.txt文件,里面写出需要下载的歌曲,如下图所示:
python爬虫基础知识-批量下载音乐_第1张图片
2.运行过程:
python爬虫基础知识-批量下载音乐_第2张图片
3. song目录为音乐保存文件,里面存放下载的歌曲:
python爬虫基础知识-批量下载音乐_第3张图片

包含知识点:

  1. re 正则表达式的使用
  2. requests 包的使用
  3. UserAgent 的使用
  4. json文件的使用
  5. 网页内容的截取
  6. OS 文件操作
  7. 音乐的存储

源代码如下:

import requests
import os
import json
from fake_useragent import UserAgent
import re

#全局变量存放结果
Fail = []
Success = []

###########################################
"""
kg_getSongList(search_text)
返回音乐列表
"""
def kg_getSongList(search_text):
    # UserAgent是识别浏览器的一串字符串,相当于浏览器的身份证,
    # 在利用爬虫爬取网站数据时,频繁更换UserAgent可以避免触发相应的反爬机制。
    ua = UserAgent(use_cache_server=False)
    search_url = "https://songsearch.kugou.com/song_search_v2?callback=jQuery112405132987859127838_1550204317910&page" \
                 "=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_fil" \
                 "ter=0&_=1550204317912&keyword={}".format(search_text)
    headers = {
        "User-Agent": ua.random
    }
    # 获取搜索列表
    try:
        res = requests.get(search_url, headers=headers, timeout=2)
        start = re.search("jQuery\d+_\d+\(?", res.text)
        js = json.loads(res.text.strip().lstrip(start.group()).rstrip(")"))
        # 注意:末尾有一个换行需要去掉
        return js['data']['lists']
    # 获取搜索列表失败
    except:
        Fail.append(search_text)

        
"""
kg_downSong(url,song_name)
下载音乐
"""
def kg_downSong(url,song_name):
    # 判断歌曲文件夹是否存在,不存在新建
    if os.path.exists("song"):
       pass
    else:
        os.mkdir("song")
    # 判断url是否存在
    if url == "":
        return
    # 保存歌曲
    if os.path.exists("./song/"+song_name+".mp3"):
        os.remove("./song/"+song_name+".mp3")
    try:
        with open("./song/"+song_name + ".mp3", "wb")as f:
            f.write(requests.get(url).content)
        Success.append(song_name)
    # 保存失败存入记录中
    except:
        Fail.append(song_name)

 
"""
kgMusic(search_text)
酷狗音乐主函数
整个函数分成三步:
1.获取搜索列表
2.取文件hash值
3.取音乐url进行下载
"""
def kgMusic(search_text, index):
    ua = UserAgent()
    headers = {
        "Cookie": "kg_mid=3786e26250f01bf2c64bc515820d9752; Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1559960644; Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1559960644; ACK_SERVER_10015=%7B%22list%22%3A%5B%5B%22bjlogin-user.kugou.com%22%5D%5D%7D; ACK_SERVER_10016=%7B%22list%22%3A%5B%5B%22bjreg-user.kugou.com%22%5D%5D%7D; ACK_SERVER_10017=%7B%22list%22%3A%5B%5B%22bjverifycode.service.kugou.com%22%5D%5D%7D; kg_dfid=0iEqIA1uep0h0AogH30Jq1Od; kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e",
        "Host": "www.kugou.com",
        "Referer": "http://www.kugou.com/",
        "UserAgent": ua.random
    }
    # 获取搜索列表
    song_list = kg_getSongList(search_text)
    # 输出列表
    # num_totl = len(song_list) if len(song_list) < 10 else 3
    # for i in range(num_totl):
    #     print(str(i + 1) + ">>>" + str(song_list[i]['FileName']).replace('', '').replace('', ''))

    # 获取文件hash值
    file_hash = song_list[index-1]['FileHash']
    hash_url = "http://www.kugou.com/yy/index.php?r=play/getdata&hash={}".format(file_hash)
    # 下载歌曲
    try:
        # 获取资源
        hash_res = requests.get(hash_url, headers=headers, timeout=2)
        # 转换成json格式
        hash_js = hash_res.json()  # json格式
        # 取出歌曲名称和歌曲id
        song_name = hash_js["data"]["audio_name"]
        play_url = hash_js['data']['play_url']
        # print(play_url) VIP付费歌曲无法获取play_url
        # 下载歌曲
        kg_downSong(play_url, song_name)

    except:
        Fail.append(search_text)

def main():
        # 获取文件中的音乐列表
        f = open("./Music.txt", "r", encoding="UTF-8")
        MusicList = []
        status = True
        while status:
            status = f.readline().replace("\n", "")
            MusicList.append(status)
        # 去除最后的空白字符
        MusicList.pop(-1)
        # 调酷狗进行下载
        print(f"正在下载{len(MusicList)}首歌曲!")
        for i in MusicList:
            print(f"{i} Downing...")
            kgMusic(i, 1)
        # 输出结果
        if Fail is not None:
            print(f"下载结束! 失败的歌曲{len(Fail)}首如下:")
            for i in Fail:
                print(i)
        print(f"{len(Success)}首歌下载完成!")
    
if __name__== "__main__":
    main()

你可能感兴趣的:(源代码)