Erlo

音乐爬虫(调试中)

2025-01-18 22:29:09 发布   59 浏览  
页面报错/反馈
收藏 点赞

获取存在音乐链接的json数据

import requests
from pyquery import PyQuery
import re

def get_music_index(name):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
        'Referer': 'http://music.2t58.com/',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
    }
    cookies = {
        'Hm_lvt_b8f2e33447143b75e7e4463e224d6b7f': '1737002552',
        'HMACCOUNT': 'F76AECD34A294FCC',
        'Hm_lpvt_b8f2e33447143b75e7e4463e224d6b7f': '1737006718'
    }

    # 使用正确的域名和协议
    encoded_name = requests.utils.quote(name)
    url = f'http://music.2t58.com/so/{encoded_name}.html'

    try:
        response = requests.get(url, headers=headers, cookies=cookies, timeout=10)
        response.raise_for_status()
        
        doc = PyQuery(response.content)

        names = doc(".name").items()
        for index, item in enumerate(names, start=1):
            print(f"选项 {index}: {item.text().strip()}")
            if index == 7:
                break

        ex = r''
        song_ids = re.findall(ex, response.text, re.S)
        
        return song_ids[:7]

    except requests.exceptions.RequestException as e:
        print(f"请求出错: {e}")
        return []   

def download_music(song_id):
    # 设置 HTTP 请求头
    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',  # 接受的内容类型
        'Accept-Encoding': 'gzip, deflate',  # 支持的编码格式
        'Accept-Language': 'zh-CN,zh;q=0.9',  # 支持的语言
        'Connection': 'keep-alive',  # 连接保持活跃
        'Content-Length': '26',  # 内容长度
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',  # 内容类型
        'Cookie': 'Hm_lvt_b8f2e33447143b75e7e4463e224d6b7f=1690974946; Hm_lpvt_b8f2e33447143b75e7e4463e224d6b7f=1690976158',  # Cookie
        'Host': 'www.2t58.com',  # 请求的主机
        'Origin': 'https://www.2t58.com',  # 请求的来源
        'Referer': 'https://www.2t58.com/song/bWhzc3hud25u.html',  # 请求的来源页面
        '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',  # 用户代理
        'X-Requested-With': 'XMLHttpRequest'  # 请求类型
    }
    # 构造 POST 请求的数据
    data = {'id': song_id, 'type': 'music'}
    # 要请求的 URL
    url2 = 'https://www.2t58.com/js/play.php'
    # 发送 POST 请求获取歌曲播放信息
    resp2 = requests.post(url=url2, headers=headers, data=data)
    # 解析返回的 JSON 数据
    json_data = resp2.json()
    print(json_data)


if __name__ == "__main__":
    name = input("请输入歌曲名称: ")
    music_index = get_music_index(name)
    # print(music_index)
    # if music_index:
    #     print("找到以下歌曲ID:")
    #     for idx, song_id in enumerate(music_index, start=1):
    #         print(f"{idx}: {song_id}")
    # else:
    #     print("没有找到相关歌曲。")
    num = int(input("请输入歌曲的序列:"))
    song_id = music_index[num - 1]
    download_music(song_id)
    print("按回车直接退出...")

# 等待用户按键,这里我们只接受单个空格键
    while True:
        user_input = input()
        if user_input == "":  # 检查用户是否只输入了一个空格
            break

实现下载音乐(目前默认的mp3)

import requests
from pyquery import PyQuery
import re

def get_music_index(name):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
        'Referer': 'http://music.2t58.com/',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
    }
    cookies = {
        'Hm_lvt_b8f2e33447143b75e7e4463e224d6b7f': '1737002552',
        'HMACCOUNT': 'F76AECD34A294FCC',
        'Hm_lpvt_b8f2e33447143b75e7e4463e224d6b7f': '1737006718'
    }

    # 使用正确的域名和协议
    encoded_name = requests.utils.quote(name)
    url = f'http://music.2t58.com/so/{encoded_name}.html'

    try:
        response = requests.get(url, headers=headers, cookies=cookies, timeout=10)
        response.raise_for_status()
        
        doc = PyQuery(response.content)

        names = doc(".name").items()
        for index, item in enumerate(names, start=1):
            print(f"选项 {index}: {item.text().strip()}")
            if index == 7:
                break

        ex = r''
        song_ids = re.findall(ex, response.text, re.S)
        
        return song_ids[:7]

    except requests.exceptions.RequestException as e:
        print(f"请求出错: {e}")
        return []   

def download_music(song_id):
    # 设置 HTTP 请求头
    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',  # 接受的内容类型
        'Accept-Encoding': 'gzip, deflate',  # 支持的编码格式
        'Accept-Language': 'zh-CN,zh;q=0.9',  # 支持的语言
        'Connection': 'keep-alive',  # 连接保持活跃
        'Content-Length': '26',  # 内容长度
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',  # 内容类型
        'Cookie': 'Hm_lvt_b8f2e33447143b75e7e4463e224d6b7f=1690974946; Hm_lpvt_b8f2e33447143b75e7e4463e224d6b7f=1690976158',  # Cookie
        'Host': 'www.2t58.com',  # 请求的主机
        'Origin': 'https://www.2t58.com',  # 请求的来源
        'Referer': 'https://www.2t58.com/song/bWhzc3hud25u.html',  # 请求的来源页面
        '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',  # 用户代理
        'X-Requested-With': 'XMLHttpRequest'  # 请求类型
    }
    # 构造 POST 请求的数据
    data = {'id': song_id, 'type': 'music'}
    # 要请求的 URL
    url2 = 'https://www.2t58.com/js/play.php'
    # 发送 POST 请求获取歌曲播放信息
    resp2 = requests.post(url=url2, headers=headers, data=data)
    # 解析返回的 JSON 数据
    json_data = resp2.json()
    return json_data


# 下载文件并保存
def download_song(url, filename):
    try:
        response = requests.get(url)
        response.raise_for_status()  # 如果响应状态码不是200,会抛出异常
        with open(filename, 'wb') as file:
            file.write(response.content)
        print(f"歌曲已成功下载并保存为 {filename}")
    except requests.exceptions.RequestException as e:
        print(f"下载过程中发生错误: {e}")

if __name__ == "__main__":
    name = input("请输入歌曲名称: ")
    music_index = get_music_index(name)
    num = int(input("请输入歌曲的序列:"))
    song_id = music_index[num - 1]
    json_data = download_music(song_id)
    # 提取 URL 和标题
    url = json_data['url']
    title = json_data['title']

    filename = title + '.mp3'
    filename = filename.replace('《', '').replace('》', '').replace('[', '').replace(']', '').replace('/', '_')

    print("歌曲URL: ", url)
    print("保存为文件: ", filename)

    download_song(url, filename)

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认